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的主要内容,如果未能解决你的问题,请参考以下文章

未调用 Rxswift Map 和 Zip

PromiseKit 是不是有 RxSwift Zip 替代方案?

在啥情况下我可以使用 zip 和 combineLatest? RxSwift

在 RxSwift 4.0.0 中正确使用 retryWhen 运算符

在 RxSwift 中具有来自 Observable 的最后两个元素的运算符

RxSwift:使用运算符组合下载照片并保存在本地