Rxswift3.0 中的 throttle 和 debounce 有什么区别?
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([=10=])})
.addDisposableTo(disposeBag)
结果是5。但是当我使用油门时,结果是1
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
.throttle(1, scheduler: MainScheduler.instance)
.subscribe(onNext: {print([=11=])})
.addDisposableTo(disposeBag)
那么,我对油门操作器是不是很了解?
在 RxSwift 的早期版本中,throttle
和 debounce
做了同样的事情,这就是为什么你会看到文章说明这一点。在 RxSwift 3.0 中,他们做了类似但相反的事情。
debounce
和 throttle
都用于过滤 observable 随时间发出的项目。
throttle
仅发出源可观察对象在时间 window.
发出的第一个项目
debounce
仅在指定的时间段过去后发出一个项目,而源 observable 没有发出另一个项目。
两者都可用于减少 observable 发出的项目数量;您使用哪一个取决于您是否希望在一段时间内发出 "first" 或 "last" 值。
术语 "debounce" 来自电子学,指的是当发生开关动作时,开关触点 "bounce" 在打开和关闭之间非常快速地变化的趋势。当您打开灯泡时,您不会注意到这一点,但微处理器每秒查看输入数千次,在开关进入最终状态之前会看到 "ons" 和 "offs" 的快速序列。这就是为什么 debounce
给你 5
的价值;在您的时间范围内(1 毫秒)发出的最后一项。如果你在你的代码中加入一个时间延迟,使这些项目发射得更慢(相隔超过 1 毫秒),你会看到 debounce
.
发射的许多项目
在应用程序中,您可以使用 debounce
来执行昂贵的搜索(假设它需要网络操作)。用户将要为他们的搜索字符串键入许多字符字符,但您不想在他们输入每个字符时启动搜索,因为搜索成本很高,并且较早的结果在他们 return.使用 debounce
可以确保仅在用户停止输入一段时间(比如 500 毫秒)后才发出搜索字符串。
您可能会使用 throttle
,因为操作需要一些时间,并且您希望在这段时间过去之前忽略进一步的输入。假设您有一个启动操作的按钮。如果用户快速连续多次点击按钮,您只想启动一次操作。您可以使用 throttle
忽略指定时间内的后续点击 window。 debounce
也可以工作,但会在发出操作项之前引入延迟,而 throttle
允许您对第一个操作做出反应并忽略其余操作。
这里有简单的解释https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4
Throttle:原函数在指定时间内最多调用一次
Debounce: 调用者在指定时间后停止调用装饰函数后调用原始函数。
看了很多关于油门和去抖的博客。他们中的大多数人说他们是同一件事。但是我从我的例子中得到了不同的结果?这是示例:
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
.debounce(1, scheduler: MainScheduler.instance)
.subscribe(onNext: {print([=10=])})
.addDisposableTo(disposeBag)
结果是5。但是当我使用油门时,结果是1
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
.throttle(1, scheduler: MainScheduler.instance)
.subscribe(onNext: {print([=11=])})
.addDisposableTo(disposeBag)
那么,我对油门操作器是不是很了解?
在 RxSwift 的早期版本中,throttle
和 debounce
做了同样的事情,这就是为什么你会看到文章说明这一点。在 RxSwift 3.0 中,他们做了类似但相反的事情。
debounce
和 throttle
都用于过滤 observable 随时间发出的项目。
throttle
仅发出源可观察对象在时间 window. 发出的第一个项目
debounce
仅在指定的时间段过去后发出一个项目,而源 observable 没有发出另一个项目。
两者都可用于减少 observable 发出的项目数量;您使用哪一个取决于您是否希望在一段时间内发出 "first" 或 "last" 值。
术语 "debounce" 来自电子学,指的是当发生开关动作时,开关触点 "bounce" 在打开和关闭之间非常快速地变化的趋势。当您打开灯泡时,您不会注意到这一点,但微处理器每秒查看输入数千次,在开关进入最终状态之前会看到 "ons" 和 "offs" 的快速序列。这就是为什么 debounce
给你 5
的价值;在您的时间范围内(1 毫秒)发出的最后一项。如果你在你的代码中加入一个时间延迟,使这些项目发射得更慢(相隔超过 1 毫秒),你会看到 debounce
.
在应用程序中,您可以使用 debounce
来执行昂贵的搜索(假设它需要网络操作)。用户将要为他们的搜索字符串键入许多字符字符,但您不想在他们输入每个字符时启动搜索,因为搜索成本很高,并且较早的结果在他们 return.使用 debounce
可以确保仅在用户停止输入一段时间(比如 500 毫秒)后才发出搜索字符串。
您可能会使用 throttle
,因为操作需要一些时间,并且您希望在这段时间过去之前忽略进一步的输入。假设您有一个启动操作的按钮。如果用户快速连续多次点击按钮,您只想启动一次操作。您可以使用 throttle
忽略指定时间内的后续点击 window。 debounce
也可以工作,但会在发出操作项之前引入延迟,而 throttle
允许您对第一个操作做出反应并忽略其余操作。
这里有简单的解释https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4
Throttle:原函数在指定时间内最多调用一次
Debounce: 调用者在指定时间后停止调用装饰函数后调用原始函数。