RxSwift - 去抖/节流"逆"

Bru*_*oga 21 ios swift rx-swift

假设我有一个即时消息应用程序,每次消息到达时都会发出哔声.我想要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)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Evg*_*eev 23

更新了RxSwift 3和改进的throttle运算符

随着throtlleRxSwift 3.0.0-beta.1中引入的运算符的新行为,您可以像这样使用它:

    downloadButton.rx.tap
    .throttle(3, latest: false, scheduler: MainScheduler.instance)
    .subscribe(onNext: { _ in
        NSLog("tap")
    }).addDisposableTo(bag)
Run Code Online (Sandbox Code Playgroud)

老版本的答案

使用window操作,然后转换Observable<Observable<Type>>到平板Observable使用flatMap.

此示例代码仅为每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)
Run Code Online (Sandbox Code Playgroud)

  • 肯定还有改进的余地.现在它没有双重订阅. (3认同)