Bruno Koga Bruno Koga - 1 year ago 220
iOS Question

RxSwift - Debounce/Throttle "inverse"

Let's say I have an instant messaging app that plays a beep sound every time a message arrives. I want to

the beeps, but I'd like to play the beep sound for the first message arrived and not for the following ones (in a timespan of, say, 2 seconds).

Another example might be: my app sends typing notifications (so the user I'm chatting with can see that I'm typing a message). I want to send a typing notification when I start typing, but only send new ones in X-seconds intervals, so I don't send a typing notification for every character I type.

Does this make sense? Is there an operator for that? Could it be achieved with the existing operators?

This is my code for the first example. I'm solving it now with
, but it's not ideal. If I receive 1000 messages in intervals of 1 second, it won't play the sound until the last message arrives (I'd like to play the sound on the first one).

.debounce(2, scheduler: MainScheduler.instance)
.subscribeNext { [weak self] message in


Answer Source

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).

    .window(timeSpan: 3, count: 10000, scheduler: MainScheduler.instance)
    .flatMap({ observable -> Observable<Void> in
        return observable.take(1)
    .subscribeNext { _ in
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download