我看过很多关于油门和反跳的博客。他们大多数人说他们是同一回事。但是我的示例得到了不同的结果吗?这是示例:
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中,throttle
它debounce
做了同样的事情,这就是为什么您会看到文章说明这一点的原因。在RxSwift 3.0中,它们执行相似但相反的操作。
两者debounce
并throttle
用来由可观察到的随着时间的推移发射过滤项。
throttle
仅发射在时间窗口中可观察到的源发射的第一项。
debounce
仅在经过指定的时间段后才发射一个项目,而可观察到的源没有发射另一个项目。
两者都可用于减少可观察对象发射的项目数量。使用哪个参数取决于您要在一个时间段内发出“第一个”还是“最后一个”值。
术语“反跳”来自电子产品,是指当发生开关动作时,开关触点在接通和断开之间迅速“反弹”的趋势。当您打开灯泡时,您不会注意到这一点,但是微处理器在每秒几千次查看输入时,会在开关进入最终状态之前看到快速的“开”和“关”序列。这就是为什么debounce
给您带来价值的原因5
;在您的时间范围内(1毫秒)发出的最后一个项目。如果您在代码中设置了时间延迟,以使项目发出的速度更慢(相距超过1毫秒),您将看到由发出的许多项目debounce
。
在应用程序中,您可以debounce
用来执行昂贵的搜索(例如需要进行网络操作)。用户将在其搜索字符串中键入许多字符,但是您不希望在输入每个字符时启动搜索,因为搜索成本高昂,并且返回之前,较早的结果将被淘汰。使用debounce
该命令可以确保仅在用户停止输入一段时间(例如500毫秒)后才发出搜索字符串。
您可能会throttle
在某个操作需要花费一些时间的地方使用它,并且想要在该时间过去之前忽略进一步的输入。假设您有一个启动操作的按钮。如果用户快速连续多次单击按钮,则您只想启动一次操作。您可以throttle
用来忽略指定时间窗口内的后续拍子。debounce
也可以使用,但会在发出操作项之前引入延迟,同时throttle
允许您对第一个操作做出反应,而忽略其余操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句