簡體   English   中英

Rxswift3.0 中的油門和去抖有什么區別?

[英]What's the difference between throttle and debounce in Rxswift3.0?

我看過很多關於節流和去抖的博客。 他們中的大多數人說他們是同一件事。 但是我從我的例子中得到了不同的結果? 這是示例:

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
          .debounce(1, scheduler: MainScheduler.instance)
          .subscribe(onNext: {print($0)})
          .addDisposableTo(disposeBag)

結果是5。但是當我使用油門時,結果是1

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
        .throttle(1, scheduler: MainScheduler.instance)
        .subscribe(onNext: {print($0)})
        .addDisposableTo(disposeBag)

所以,我不明白油門操作員?

在早期版本的RxSwift的, throttledebounce做同樣的事情,這就是為什么你會看到的文章,指出這一點。 在 RxSwift 3.0 中,他們做了類似但相反的事情。

debouncethrottle都用於過濾 observable 隨着時間的推移發出的項目。

  • throttle僅發出時間窗口中源 observable 發出的第一項。

  • debounce僅在指定的時間段過后才發出一個項目,而源 observable 不會發出另一個項目。

兩者都可用於減少 observable 發出的項目數量; 您使用哪一個取決於您是否希望在一段時間內發出“第一個”或“最后一個”值。

術語“去抖動”來自電子學,指的是當發生開關動作時,開關觸點在打開和關閉之間非常快速地“彈跳”的趨勢。 當您打開燈泡時,您不會注意到這一點,但是在開關穩定到最終狀態之前,微處理器每秒查看輸入數千次會看到“開”和“關”的快速序列。 這就是為什么debounce給你5的值; 在您的時間范圍內發出的最后一項(1 毫秒)。 如果您將時間延遲放入代碼中,以便項目發出的速度更慢(相隔 1 毫秒以上),您將看到debounce發出的許多項目。

在應用程序中,您可以使用debounce來執行昂貴的搜索(比如它需要網絡操作)。 用戶將要為他們的搜索字符串鍵入多個字符,但您不想在他們輸入每個字符時啟動搜索,因為搜索成本高昂,而且較早的結果在返回時已過時。 使用debounce您可以確保僅在用戶停止輸入一段時間(例如 500 毫秒)時才發出搜索字符串。

您可能會在操作需要一些時間的情況下使用throttle ,並且您希望在該時間過去之前忽略進一步的輸入。 假設您有一個啟動操作的按鈕。 如果用戶快速連續多次點擊按鈕,您只想啟動一次操作。 您可以使用throttle來忽略指定時間窗口內的后續點擊。 debounce也可以工作,但會在發出動作項之前引入延遲,而throttle允許您對第一個動作做出反應並忽略其余動作。

簡單的解釋在這里https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4

Throttle : 原函數每指定周期最多調用一次。

Debounce :在調用者在指定時間段后停止調用裝飾函數后調用原始函數。

暫無
暫無

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

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