【问题标题】:How to display and recover from API errors in ViewController when using RxSwift使用 RxSwift 时如何在 ViewController 中显示 API 错误并从中恢复
【发布时间】:2016-09-18 02:16:09
【问题描述】:

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

如果我包装了错误,我如何/应该如何“向下”传达给 API 层以尝试重试?如果我不包装错误,我有两个问题: 1) 如何使retry 以用户对警报的响应为条件?和 2) 我如何/应该如何“重新初始化”流?

我唯一能想到的就是传回一个带有错误的“重试主题”,并让视图控制器通过在相关的 observable 上发出一些东西来指示重试请求(即为主题分配一个值) 这将与 API 流相关联。然而,这似乎非常令人费解。

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

【问题讨论】:

    标签: ios uiviewcontroller error-handling rx-swift reactivex


    【解决方案1】:

    我的解决方案是将它们包装成这种类型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 }
    

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

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2011-04-20
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      相关资源
      最近更新 更多