我见过很多关于油门和去抖的博客。大多数人都说他们是一回事。但是我从我的例子中得到了不同的结果?这是一个例子:
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)
所以,我无法理解油门操作员?
答案 0 :(得分:5)
在早期版本的RxSwift中,throttle
和debounce
做了同样的事情,这就是为什么你会看到文章陈述这一点。在RxSwift 3.0中,他们做了类似但相反的事情。
debounce
和throttle
都用于过滤观察者随时间发出的项目。
throttle
仅在时间窗口中发出源可观察项发出的第一个项目。
debounce
仅在指定的时间段过后发出一个项目,而源观察不会发出另一个项目。
两者都可以用来减少观察者发出的物品数量;您使用哪一个取决于您是否想要在一段时间内发出的“第一个”或“最后一个”值。
术语“去抖动”来自电子设备,指的是当切换动作发生时,开关触点在打开和关闭之间“反弹”的趋势。当你打开一个灯泡时,你不会注意到这一点,但微处理器每秒看几次输入会在开关进入最终状态之前看到快速的“ons”和“offs”序列。这就是debounce
为您提供5
值的原因;在您的时间范围内发出的最终项目(1毫秒)。如果您在代码中加入时间延迟,以便项目发出的速度更慢(相隔超过1毫秒),您会看到debounce
发出的一些项目。
在应用中,您可以使用debounce
执行昂贵的搜索(例如,它需要网络操作)。用户将为其搜索字符串键入多个字符字符,但您不希望在输入每个字符时启动搜索,因为搜索费用昂贵且早期结果在返回时将过时。使用debounce
,您可以确保仅在用户停止键入一段时间(例如500毫秒)后才会发出搜索字符串。
您可以使用throttle
,其中操作需要一些时间,并且您希望在该时间过去之前忽略进一步的输入。假设您有一个启动操作的按钮。如果用户快速连续多次点击按钮,您只想启动一次操作。您可以使用throttle
忽略指定时间窗口内的后续点击。 debounce
也可以工作,但会在发布操作项之前引入延迟,而throttle
允许您对第一个操作做出反应而忽略其余操作。
答案 1 :(得分:1)
简单的解释在这里https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4
油门:原始功能在指定的时间段内最多只能调用一次。
去抖动:在调用者在指定时间段后停止调用修饰的函数之后,将调用原始函数。