【问题标题】:RxSwift dispose observable in Zip operatorRxSwift 在 Zip 运算符中处理 observable
【发布时间】: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 块中/之后设置可观察的计时器?

【问题讨论】:

    标签: ios swift reactive-programming rx-swift


    【解决方案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,感谢您的回答,是的,现在一切正常)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2016-06-24
    • 2021-05-11
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多