Rxswift3.0中的油门和去抖有什么区别?

时间:2017-05-10 09:18:42

标签: ios swift rx-swift

我见过很多关于油门和去抖的博客。大多数人都说他们是一回事。但是我从我的例子中得到了不同的结果?这是一个例子:

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)

所以,我无法理解油门操作员?

2 个答案:

答案 0 :(得分:5)

在早期版本的RxSwift中,throttledebounce做了同样的事情,这就是为什么你会看到文章陈述这一点。在RxSwift 3.0中,他们做了类似但相反的事情。

debouncethrottle都用于过滤观察者随时间发出的项目。

  • 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

油门:原始功能在指定的时间段内最多只能调用一次。

去抖动:在调用者在指定时间段后停止调用修饰的函数之后,将调用原始函数。