我有一个Observable<Item>,它异步地发出一系列项。对于流中的每一项,我需要显示一个UIAlertView。每次用户解除警报(如果有一个新的项目),我需要抓住下一个项目,并为它显示一个新的警报。
我遇到的问题是,可观察到的物品排放得太快了。当显示警报时,会发出多个项,而我将丢失该信息。
流可能在一秒钟内产生10个项目,我想显示10个弹出窗口,这些弹出窗口将依次打开,一次一项,一个接一个。
是否只有当我准备好显示警报时才能使用流中的下一项?
发布于 2017-11-14 13:47:24
你可以这样做
拿两个可观测的:
然后使用zip组合运算符在这2个可观测值中创建第三个可观测值。由于zip算子,第三个可观测值只在可观测值1和可观测值2都发出值时才发出值。换句话说,当您的流中有一个事件时,当用户拒绝先前的警告时,它就会发出一个值。每次第三个(压缩的)可观察到的值都会显示一个警告。
下面是关于zip操作符如何工作的图片(从难以置信的RxMarbles中窃取):

在这个映像中,第一行是您的流。第二行是用户取消警报视图。第三行是显示下一个警报的信号。
您可以看到,在显示警报(1A)时,您的流中还会发出两个值((2)和(3))。压缩需要注意的是,只有当用户解除警报(B)时,才会发出第三行上的下一个事件。然后,压缩“抓取”您的流中的下一个事件,并在第三行上发射(2B)。这将导致显示下一个警报。
要完成这项工作,您必须使用一个事件(A)启动可观察到的“警报解除”。否则,zip将等待第一个警报被解除,然后才会触发第一个事件。
在代码中,它看起来应该是这样的。(我只是使用一个Observable<Int>来模拟您的流)。可观测的didDismissedAlert是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)https://stackoverflow.com/questions/47286569
复制相似问题