抛出错误替代 catchErrorJustReturn 的 RxSwift Observable

Posted

技术标签:

【中文标题】抛出错误替代 catchErrorJustReturn 的 RxSwift Observable【英文标题】:RxSwift Observable that throws Error alternative to catchErrorJustReturn 【发布时间】:2019-11-09 16:05:33 【问题描述】:

我正在寻找替代方法来处理通过 Observable 序列引发的错误。

我有一个经常抛出 DaoError.notFound 的数据库请求(表示尚未找到数据)。

然后我正在执行将新数据保存到数据库的远程 API 请求,它应该导致 CoreData 通过第一个 Observable 序列发出新数据。但是尽管使用了 RxCoreData,它并没有发生。原因是第一个 Observable 以 Error 终止。

我可以使用:

catchErrorJustReturn([]) 但它会发出空元素数组并完成 Observable 序列,不会再通过该序列发出元素。

retry() 但它挂起重试,这也不是完美的解决方案,因为当没有元素时我只想显示没有项目的空表视图。

完美的解决方案只是以某种方式将错误或错误映射到空数组,但保持 Observable 流处于活动状态。但它不会发生。

最简单的解决方案是将 DaoError.notFound 替换为返回空数组,但奇怪的是我无法保留错误,并且在某些用法中会创建无限流并忽略错误。

【问题讨论】:

【参考方案1】:

这听起来像是 catchError(_:) 的工作

let myData = database.getData().catchError  _ in api.getData().startWith([]) 

基于注释的附加代码:

这是一个更复杂的例子:

let myData = database.getData().catchError  _ in
    api.getData()
        .do(onNext:  database.saveData($0) )
        .startWith([])

上面将尝试从数据库中获取数据。如果失败,那么它将发出一个空数组并尝试从 API 获取数据。如果它获得新数据,则它将新数据保存在数据库中并发出新数据。

基本答案还是一样,使用catchError(_:)

【讨论】:

我认为这行不通。由于我想从数据库中获取数据,如果有一些数据正常,则没有数据返回空数组(将错误更改为此空数组),并且每次刷新它们时都请求新数据,如果刷新此数据数据库流应该推送这个刷新的数据。如果我使用我当前的解决方案错误会导致流完成并且不再推送刷新。如果我按照我的理解执行您的解决方案,则仅当数据库中没有数据并且出现错误时才会进行刷新,并且如果有缓存的旧数据,它们将不会被刷新。 我认为这是更好的方法。我可以接受。当然有缺点,据我了解,我希望有流到数据库,每次这些数据库请求发生更改时都会通知观察者。示例我从数据库中获取数据并具有稍后刷新的序列,每次通过 RxCoreData 进行更改时,它是通过下面的 NFFetchResultsController 进行的。但是在这里我有错误以这样的方式处理,如果它发生然后发出api请求(它以前返回[]空数组)并且在它从api获取数据之后它只是返回它们(现在也保存在DB中)然后完成 所以在这个请求之后没有直播到数据库。另外,数据库中的情况是来自先前请求的旧数据。然后此代码不会刷新缓存的数据,因为不会发生错误并且需要调用远程 api。至于现在,我已将 throw DaoError.notFound 替换为仅返回空数组,因为我无法构思更好的解决方案来处理错误,这样流将继续存在,api 请求刷新数据并通过实时数据库流通知观察者

以上是关于抛出错误替代 catchErrorJustReturn 的 RxSwift Observable的主要内容,如果未能解决你的问题,请参考以下文章

Mac Catalyst 的替代 UIActivityViewController 保存对话框或 UIDocumentPickerViewController 抛出错误代码 260 的解决方案

使用替代变量运行游标

替代 .tar 用于具有更改文件的目录

是否有任何替代工具可以替代 HTMLUnit for Android?

为 notNull 检查抛出 IllegalArgumentException 的前提条件库

人工智能岗位替代——操作员