微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用RxSwift执行操作的顺序

我正在使用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()方法.有没有其他方法来做这个链接的东西或我在如何使用ReactiveX一般错误

解决方法

是的,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] 举报,一经查实,本站将立刻删除。

相关推荐