[英]RxSwift - Debounce/Throttle "inverse"
假设我有一个即时消息应用程序,每次消息到达时都会播放哔声。 我想消除debounce
哔声,但我想为到达的第一条消息播放哔哔声,而不是为以下消息播放哔声(例如,2 秒的时间跨度)。
另一个示例可能是:我的应用程序发送输入通知(因此与我聊天的用户可以看到我正在输入消息)。 我想在开始输入时发送输入通知,但仅以 X 秒为间隔发送新通知,因此我不会为我输入的每个字符发送输入通知。
这有意义吗? 有运营商吗? 现有的运营商能做到吗?
这是我的第一个示例的代码。 我现在用debounce
解决它,但这并不理想。 如果我每隔 1 秒收到 1000 条消息,则在最后一条消息到达之前它不会播放声音(我想在第一条消息上播放声音)。
self.messagesHandler.messages
.asObservable()
.skip(1)
.debounce(2, scheduler: MainScheduler.instance)
.subscribeNext { [weak self] message in
self?.playMessageArrivedSound()
}.addDisposableTo(self.disposeBag)
谢谢!
针对 RxSwift 3 进行了更新并改进了throttle
操作员
随着 RxSwift 3.0.0-beta.1 中引入的throttle
操作符的新行为,您可以像这样使用它:
downloadButton.rx.tap
.throttle(3, latest: false, scheduler: MainScheduler.instance)
.subscribe(onNext: { _ in
NSLog("tap")
}).addDisposableTo(bag)
旧版答案
使用window
运算符,然后使用flatMap
将Observable<Observable<Type>>
转换为平面Observable
。
此示例代码仅在每 3 秒窗口中的第一次点击时打印“点击”(或者如果点击计数超过 10000)。
downloadButton.rx_tap
.window(timeSpan: 3, count: 10000, scheduler: MainScheduler.instance)
.flatMap({ observable -> Observable<Void> in
return observable.take(1)
})
.subscribeNext { _ in
NSLog("tap")
}.addDisposableTo(bag)
Window 是一个很好的解决方案,但我发现示例运算符更直观且行为正确。
messagesHandler.messages
.sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))
.subscribeNext { [weak self] message in
self?.playMessageArrivedSound()
}.addDisposableTo(self.disposeBag)
油门操作没有做我认为应该做的事情。
对于那些也觉得油门太混乱的人:
“只有当源 observable 在指定的时间段内停止发送事件时,节流才会转发事件。这不适用于常规事件传递”了解更多详细信息。
在这种情况下,您想要的过滤器是
sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.