首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxSwift,如何应用背压来连续显示流中每个项目的UIAlertView

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

Stack Overflow用户
提问于 2017-11-14 13:00:07
回答 1查看 1.1K关注 0票数 1

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

我遇到的问题是,可观察到的物品排放得太快了。当显示警报时,会发出多个项,而我将丢失该信息。

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

是否只有当我准备好显示警报时才能使用流中的下一项?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-14 13:47:24

你可以这样做

拿两个可观测的:

  1. 正如你在回答中所描述的那样,你现有的可观察到的数据会释放出一个值。
  2. 一种可观察的方法,每当用户取消警报视图时,就会发出一个值。

然后使用zip组合运算符在这2个可观测值中创建第三个可观测值。由于zip算子,第三个可观测值只在可观测值1和可观测值2都发出值时才发出值。换句话说,当您的流中有一个事件时,当用户拒绝先前的警告时,它就会发出一个值。每次第三个(压缩的)可观察到的值都会显示一个警告。

下面是关于zip操作符如何工作的图片(从难以置信的RxMarbles中窃取):

在这个映像中,第一行是您的流。第二行是用户取消警报视图。第三行是显示下一个警报的信号。

您可以看到,在显示警报(1A)时,您的流中还会发出两个值((2)(3))。压缩需要注意的是,只有当用户解除警报(B)时,才会发出第三行上的下一个事件。然后,压缩“抓取”您的流中的下一个事件,并在第三行上发射(2B)。这将导致显示下一个警报。

要完成这项工作,您必须使用一个事件(A)启动可观察到的“警报解除”。否则,zip将等待第一个警报被解除,然后才会触发第一个事件。

在代码中,它看起来应该是这样的。(我只是使用一个Observable<Int>来模拟您的流)。可观测的didDismissedAlertObservable<Void>

代码语言:javascript
运行
复制
Observable.zip(stream, didDismissAlert.startWith(())) { (streamValue, _) -> Int in
        return streamValue
    }
    .subscribe(onNext: { streamValue in
        // showAlert with the value from the stream
    })
    .disposed(by: disposeBag)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47286569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档