假设我有一个即时消息传递应用程序,每次收到消息时都会发出蜂鸣声。我想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
运算符
通过throtlle
RxSwift 3.0.0-beta.1中引入的operator 新行为,您可以像这样使用它:
downloadButton.rx.tap
.throttle(3, latest: false, scheduler: MainScheduler.instance)
.subscribe(onNext: { _ in
NSLog("tap")
}).addDisposableTo(bag)
旧版本的答案
使用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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句