加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用RxSwift执行操作的顺序

发布时间:2020-12-14 04:45:43 所属栏目:百科 来源:网络整理
导读:我正在使用Rx Swift来完成我的代码.对于我目前的项目,我想将RxSwift的原则应用于来自LayerKit的一堆完成块: layerClient.connectWithCompletion { (success,error) - () in if (!success) { // Error } else { layerClient.requestAuthenticationNonceWithC
我正在使用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运算符时要小心,此运算符将在恢复后终止序列,之后将忽略任何额外事件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读