我试图弄清楚在处理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/