RxSwift – 去抖/调节“反”

比方说,我有一个即时通讯应用程序,每次消息到达时都会发出嘟嘟声。 我想消除嘟嘟声,但我想播放第一条消息的哔声,而不是以下(比如2秒)。

另一个例子可能是:我的应用程序发送键入通知(所以我聊天的用户可以看到,我正在input一条消息)。 我想在开始input时发送打字通知,但只以X秒的间隔发送新的打字通知,所以我不会为每个input的字符发送打字通知。

这有道理吗? 有没有一个运营商? 现有的运营商可以实现吗?

这是我第一个例子的代码。 我现在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中引入了throtlle运算符的新行为,您可以像这样使用它:

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

旧版本的答案

使用window运算符,然后使用flatMapObservable<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) 

窗口是一个很好的解决scheme,但是我发现样本操作符更直观,行为正确。

 messagesHandler.messages .sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance)) .subscribeNext { [weak self] message in self?.playMessageArrivedSound() }.addDisposableTo(self.disposeBag) 

油门操作没有做我认为应该的。

对于那些也觉得油门太混乱的人来说:

“一旦源观察者在指定的时间内停止发送事件,节stream将只转发一个事件, 对于更多细节,这不适用于常规事件传递”。

在这种情况下,你想要的filter是

 sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))