RxSwift throttle() 获取第一个元素

Posted

技术标签:

【中文标题】RxSwift throttle() 获取第一个元素【英文标题】:RxSwift throttle() to get first element 【发布时间】:2016-10-02 02:16:16 【问题描述】:

我正在寻找一种方法,让throttle() 运算符在给定的时间间隔内放弃Observable 中的第一个元素,而不是最后一个元素。

RxSwift - Debounce/Throttle "inverse" 中已提出(并回答)了一个类似问题,但我想避免这些答案中的不完善之处。也就是说,在理想情况下,获取Observable 中发出的第一个元素,并且在时间间隔期间忽略任何未来的元素。然而,当使用window()timer() 时,有可能两个元素在给定的时间间隔内 进行,因为计时器碰巧没有与throttle() 的开始并行运行称呼。示例:

|..........|..........|..........|
                    ^   ^
                first   second

它们属于不同的窗口,因此都被链接答案中描述的不完美解决方案所接受。

理想情况下,有一种方法可以在窗口中的第一个元素进入时立即重新启动计时器,这样上面的示例就会变成这样:

|..........|.......|..........|
                    ^   ^
                first   second (ignored)

有什么想法吗?

编辑:需要明确的是,我不确定 RxSwift 3.0-beta1 的 throttle() 种类如何处理这个问题,但我正在寻找 RxSwift 2.x 实现的解决方案。

【问题讨论】:

【参考方案1】:

事实证明,rxSwift 3.0 以我想要的方式处理 throttle()。它需要一个元素,然后在 x 秒内忽略任何其他元素(没有我在问题中提到的“窗口问题”)。

为了完整起见:debounce() 仍然按照 rxSwift 的“旧”节流定义工作。也就是说,它需要时间间隔中的最后一项。

【讨论】:

以上是关于RxSwift throttle() 获取第一个元素的主要内容,如果未能解决你的问题,请参考以下文章

Swift - RxSwift的使用详解32(UITableView的使用3:刷新表格数据)

在 RxSwift 中接收和发送 observable

使用 RxSwift 只执行一次 API 调用

地图中的 RxSwift 多个可观察对象

RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?

RxSwift:立即交付第一个项目,消除后续项目