gpt4 book ai didi

swift - RxSwift 的操作顺序

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:44 25 4
gpt4 key购买 nike

我正在使用 RxSwift 来简化我的代码。对于我当前的项目,我想将 RxSwift 的原则应用于 LayerKit 中的一堆完成 block :

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 运算符,因为这个名字非常危险。

then 可以是 Reactive Extensions 世界中的很多东西 map flatMap 甚至 switchLatest,取决于上下文。

在这种情况下,我建议使用 flatMap,因为使用 map 返回的是 Observable 中的 Observable,在大多数情况下很难合并和管理。所以我会这样做:

self.layerClient.rx_connect()
.flatMap(){ _ in
return rx_requestAuthenticationNonce()
.catchError(displayError)
}
.subscribeNext(…
.onError(… // To catch all errors

在这种情况下,我会使用 flatMap 而不是 map,因为在 rx_requestAuthenticationNonce() 的情况下,我可以在不终止序列的情况下捕获错误> 失败。

小心使用catchError 运算符,此运算符将在恢复后终止序列,之后任何额外的事件都将被忽略。

关于swift - RxSwift 的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com