RxSwift-反跳/油门“反”

布鲁诺·科加(Bruno Koga):

假设我有一个即时消息传递应用程序,每次收到消息时都会发出蜂鸣声。我想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)

谢谢!

叶夫根尼·苏雷耶夫(Evgeny Sureev):

更新了RxSwift 3并改进了throttle运算符

通过throtlleRxSwift 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章