RxSwift 在 Zip 运算符中处理 observable
Posted
技术标签:
【中文标题】RxSwift 在 Zip 运算符中处理 observable【英文标题】:RxSwift dispose observable in Zip operator 【发布时间】:2019-11-17 15:01:38 【问题描述】:我遇到了 zip 运算符的问题。我打算使用可观察的计时器
var timer = Observable<Int>
.interval(0.1, scheduler: MainScheduler.instance)
.do(onNext:
num in
if(num == 20)
//Purpose of this timer is to show progress if second request takes too long
MessagesManager.show_progress()
)
let source = Observable .... //my observable of networking request
return Observable.zip(source, timer,
resultSelector: value1, value2 in
// Here i want to cancel/dispose/stop timer observable
return value1
)
.do(onNext:
item in
MessagesManager.dismiss_progress()
, onError:
error in
MessagesManager.dismiss_progress()
)
我希望 zip 运算符在第一次调用 onComplete 时关闭第二个 observable,但在网络请求完成后计时器继续工作。我该如何解决这个问题并在 zip 块中/之后设置可观察的计时器?
【问题讨论】:
【参考方案1】:使用take(1)
限制预期元素的数量:
return Observable.zip(source, timer,
resultSelector: value1, value2 in
return value1
)
.take(1)
.do(onNext:
item in
MessagesManager.dismiss_progress()
, onError:
error in
MessagesManager.dismiss_progress()
)
这样,在 source 发出第一个元素后, zip 将创建第一对项目。在您的 resultSelector
中,您从这对中选择第一个项目,take(1)
将确保立即完成(然后处置)可观察对象。
【讨论】:
Mateusz,感谢您的回答,是的,现在一切正常)以上是关于RxSwift 在 Zip 运算符中处理 observable的主要内容,如果未能解决你的问题,请参考以下文章
PromiseKit 是不是有 RxSwift Zip 替代方案?
在啥情况下我可以使用 zip 和 combineLatest? RxSwift
在 RxSwift 4.0.0 中正确使用 retryWhen 运算符