我遇到了 zip 运算符的问题。我打算使用 timer observable
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 时关闭第二个可观察对象,但计时器在网络请求完成后继续工作。我该如何解决这个问题并在 zip block 中/之后配置可观察的计时器?
最佳答案
使用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)
将确保立即完成(然后处置)observable。
关于ios - RxSwift 在 Zip 运算符中配置可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58901805/