RxSwift,如何应用背压来为Stream中的每个项目连续显示UIAlertView

时间:2017-11-14 13:00:08

标签: ios reactive-programming rx-swift

我有Observable<Item>异步发出一系列项目。对于流中的每个项目,我需要显示UIAlertView。每次用户解除警报时(如果有新项目),我需要抓住下一个项目并为其显示新警报。

我遇到的问题是Observable发出的项目太快了。显示警报时,会发出几个项目,但我丢失了这些信息。

流可能会在一秒内产生10个项目,我想显示10个弹出窗口,这些弹出窗口将连续打开,一次打开一个,一个接一个打开。

有没有办法在我准备好显示警报时使用流中的下一个项目?

1 个答案:

答案 0 :(得分:2)

你可以这样做

选择2个Observables:

  1. 您现有的Observable,它会按您在答案中描述的那样发出值。
  2. 一个Observable,只要用户解除警报视图,就会发出一个值。
  3. 然后使用zip组合运算符从这2个Observable中创建第三个Observable。由于zip运算符,当Observable 1和Observable 2都发出一个值时,第三个Observable只发出一个值。换句话说,当您的流中有事件并且用户取消之前的警报时,它会发出一个值。每当第三个(压缩的)Observable发出一个值,你就会显示一个警告。

    以下是关于zip运算符如何工作的图像(从神话般的RxMarbles中窃取):

    enter image description here

    在此图片中,第一行是您的信息流。 第二行是用户关闭警报视图。 第三行是显示下一个警报的信号。

    您可以看到,当显示警告(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)