ios - 使用RxSwift时如何显示和从ViewController中的API错误中恢复

标签 ios uiviewcontroller error-handling rx-swift reactivex

我试图弄清楚在处理RxSwift流时如何在ViewController层重试API调用。我知道我可以将错误包装在Element中,也可以返回流Error。在这两种情况下,都不清楚用户如何自行决定如何“重试”该操作(例如,在发出警报后)。

如果我包装了错误,如何/应该“向下”通讯回API层以尝试重试?如果我不包装错误,则有两个问题:
1)如何使retry取决于用户对警报的响应?和
2)如何/应该“重新初始化”流?

我唯一能想到的是传回带有错误的“重试主题”,并让 View Controller 通过在关联的可观察对象上发出某些内容(即为主题分配值)来指示重试请求,这将术语与API流相关联。然而,这似乎令人费解。

更笼统地说,我很感谢任何有关使用流/可观察对象处理应用程序错误的有用文献的引用。我觉得我对RxSwift对象和运算符以及如何处理“快乐路径”情况有很好的了解,但是我不清楚在连续运行的应用程序中如何稳健地处理错误。

最佳答案

我的解决方案是将它们包装为Result<AnyObject,ErrorType>类型

例如,用户登录方案

// where API.login() takes the response data and try to map to JSON
// then try to map into Result<JSON,ErrorType>
let loginStream: Result<JSON,ErrorType> = loginTaps.flatMap { API.login() }
                                                   .shareReplay()

let loginResponse = loginStream.filter { $0.value != nil }.map { $0.value }
let loginError = loginStream.filter { $0.error != nil }.map { $0.error }

流永远不会被终止,因此无需重新订阅它们。

关于ios - 使用RxSwift时如何显示和从ViewController中的API错误中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39553432/

相关文章:

ios - 提交到 AppStore 时出现奇怪的错误

ios - 在 tableview 的 swift 文件之间快速传递数组

ios - 带有多个图像和缩放的 ScrollView

objective-c - 添加的按钮未显示在 UINavigationController 上

ruby-on-rails - 自定义错误处理和康康

iphone - 电影播放小而不是全尺寸

ios - 如果我在另一个 View 上添加 subview 而不删除它,应用程序会被挂起

ios - 如何知道 iOS 8 中的当前 interfaceOrientation?

python - 如何使用 Python 正确传播错误消息

SQL Azure 数据库重试逻辑