Let\'s say I have an instant messaging app that plays a beep sound every time a message arrives. I want to debounce
the beeps, but I\'d like to play the beep so
Window is a great solution, but I find the sample operator more intuitive and also with correct behavior.
messagesHandler.messages
.sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))
.subscribeNext { [weak self] message in
self?.playMessageArrivedSound()
}.addDisposableTo(self.disposeBag)
The throttle operation does not do what I thought it should.
For people that also find throttle is too confusing:
"throttle will only forward an event once the source observable has stopped sending events for the specified period of time. This does not work well with regular event delivery" for more details.
In this case, the filter you want is
sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))
Updated for RxSwift 3 and improved throttle
operator
With new behavior of throtlle
operator, introduced in RxSwift 3.0.0-beta.1, you can use it just like that:
downloadButton.rx.tap
.throttle(3, latest: false, scheduler: MainScheduler.instance)
.subscribe(onNext: { _ in
NSLog("tap")
}).addDisposableTo(bag)
Old version of answer
Use window
operator and then transform Observable<Observable<Type>>
to flat Observable
using flatMap
.
This sample code prints 'tap' only for first tap in every 3 seconds windows (or if tap count exceeds 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)