我有Observable<Item>
异步发出一系列项目。对于流中的每个项目,我需要显示UIAlertView。每次用户解除警报时(如果有新项目),我需要抓住下一个项目并为其显示新警报。
我遇到的问题是Observable发出的项目太快了。显示警报时,会发出几个项目,但我丢失了这些信息。
流可能会在一秒内产生10个项目,我想显示10个弹出窗口,这些弹出窗口将连续打开,一次打开一个,一个接一个打开。
有没有办法在我准备好显示警报时使用流中的下一个项目?
答案 0 :(得分:2)
你可以这样做
选择2个Observables:
然后使用zip
组合运算符从这2个Observable中创建第三个Observable。由于zip
运算符,当Observable 1和Observable 2都发出一个值时,第三个Observable只发出一个值。换句话说,当您的流中有事件并且用户取消之前的警报时,它会发出一个值。每当第三个(压缩的)Observable发出一个值,你就会显示一个警告。
以下是关于zip
运算符如何工作的图像(从神话般的RxMarbles中窃取):
在此图片中,第一行是您的信息流。 第二行是用户关闭警报视图。 第三行是显示下一个警报的信号。
您可以看到,当显示警告(1A)时,您的信息流中会发出另外两个值((2)和(3))。压缩只会在用户解除警报(B)时发出第三行的下一个事件。然后,压缩“抓取”您的流中的下一个事件,并在第三行发出(2B)。这导致显示下一个警报。
要完成这项工作,您必须通过一个事件(A)启动“警报已解除”Observable。因为否则zip
将等待第一个警报在其发起第一个事件之前被解雇。
在代码中,它看起来像这样。 (我只是使用Observable<Int>
来模拟你的流)。 didDismissedAlert
Observable的类型为Observable<Void>
:
Observable.zip(stream, didDismissAlert.startWith(())) { (streamValue, _) -> Int in
return streamValue
}
.subscribe(onNext: { streamValue in
// showAlert with the value from the stream
})
.disposed(by: disposeBag)