首页 > 解决方案 > 抛出错误替代 catchErrorJustReturn 的 RxSwift Observable

问题描述

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

我有经常抛出 DaoError.notFound 的数据库请求(意味着尚未找到数据)。

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

我可以用:

catchErrorJustReturn([])但它会发出一个空的元素数组并完成 Observable 序列,不会通过这个序列发出更多的元素。

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

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

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

标签: rx-swiftrx-cocoa

解决方案


这听起来像是一份工作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(_:).


推荐阅读