[英]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.