簡體   English   中英

RxSwift - 去抖動/油門“逆”

[英]RxSwift - Debounce/Throttle "inverse"

假設我有一個即時消息應用程序,每次消息到達時都會播放嗶聲。 我想消除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操作員

隨着 RxSwift 3.0.0-beta.1 中引入的throttle操作符的新行為,您可以像這樣使用它:

    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)

Window 是一個很好的解決方案,但我發現示例運算符更直觀且行為正確。

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

油門操作沒有做我認為應該做的事情。

對於那些也覺得油門太混亂的人:

“只有當源 observable 在指定的時間段內停止發送事件時,節流才會轉發事件。這不適用於常規事件傳遞”了解更多詳細信息

在這種情況下,您想要的過濾器是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM