rx-swift - 抛出错误替代 catchErrorJustReturn 的 RxSwift Observable
问题描述
我正在寻找替代方法来处理通过 Observable 序列引发的错误。
我有经常抛出 DaoError.notFound 的数据库请求(意味着尚未找到数据)。
然后我正在执行将新数据保存到数据库的远程 API 请求,它应该导致 CoreData 通过第一个 Observable 序列发出新数据。但尽管使用了 RxCoreData,它并没有发生。原因是第一个 Observable 以 Error 终止。
我可以用:
catchErrorJustReturn([])但它会发出一个空的元素数组并完成 Observable 序列,不会通过这个序列发出更多的元素。
retry()但它挂起重试,这也不是完美的解决方案,因为当没有元素时,我只想显示没有项目的空表视图。
完美的解决方案就是以某种方式将错误或错误映射到空数组,但保持 Observable 流处于活动状态。但它不会发生。
最简单的解决方案是将 DaoError.notFound 替换为返回空数组,但奇怪的是我不能保持错误,并且在某些用法中会创建无限流并忽略错误。
解决方案
这听起来像是一份工作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(_:)
.
推荐阅读
- python - plot_date 函数为每小时数据设置 xticks
- java - 在 Hibernate 多租户配置中禁用 Spring 数据源配置
- amazon-web-services - 该工厂未使用火花流和 AWS 创建的套接字
- python - 使用字符串方法过滤列值上的行
- php - 从php添加逗号Json
- javascript - 在 Mongoose 中测试验证而不访问数据库
- windows - 管理员与非管理员模式 - 无法覆盖变量,因为变量已被优化
- c# - 使用 mysql 参数时未填充 Datagrid 视图
- vba - 嵌套如果 - 可能更好的解决方案?
- java - Programmatically creating a rectangular Shape with a rectangular cutout for a Button