我正在使用Rx
Swift来完成我的代码.对于我目前的项目,我想将RxSwift的原则应用于来自LayerKit的一堆完成块:
layerClient.connectWithCompletion { (success,error) -> () in if (!success) { // Error } else { layerClient.requestAuthenticationNonceWithCompletion { (nonce,error) -> () in // Even more blocks } } }
我在考虑这样的事情:
// In extension public func rx_connect() -> Observable<Bool> { return create { observer in self.connectWithCompletion { (success,error) -> ()in if (success) { observer.on(.Next(success)) observer.on(.Completed) } else { observer.on(.Error(error)) } } return nopdisposable.instance } } public func rx_requestAuthenticationNonce() -> Observable<String> { // Same for annother method } // In AppDelegate self.layerClient.rx_connect() .then() // requestAuthenticationNonceWithCompletion and use the nonce for next action .then() .subscribeNext(… .onError(… // To catch all errors
解决方法
是的,RxSwift没有then运算符,因为名称风险很大.
那么Reactive Extensions世界中的很多东西都可以是flatMap,甚至是switchLatest,具体取决于上下文.
在这种情况下,我建议使用flatMap,因为将使用map返回一个Observable of Observables,在大多数情况下很难组合和管理.所以我会这样做:
self.layerClient.rx_connect() .flatMap(){ _ in return rx_requestAuthenticationNonce() .catchError(displayError) } .subscribeNext(… .onError(… // To catch all errors
在这种情况下,我会使用flatMap而不是map,因为在rx_requestAuthenticationNonce()失败的情况下,我能够在不终止序列的情况下捕获错误.
使用catchError运算符时要小心,此运算符将在恢复后终止序列,之后将忽略任何额外事件.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。