哪个 RxSwift 运算符用于唯一发出的元素以及如何使用?
Posted
技术标签:
【中文标题】哪个 RxSwift 运算符用于唯一发出的元素以及如何使用?【英文标题】:Which RxSwift operator to use for uniquely emitted elements and how to? 【发布时间】:2020-04-02 15:19:45 【问题描述】:location.filter($0.speed < 25)
.debounce(.seconds(20), scheduler: MainScheduler.instance)
.subscribe(onNext: (location) in
print(location)
).disposed(by: disposeBag)
目标:
-
如果速度属性仍然低于
25 for 20 seconds
,则打印位置
如果within 20
秒速达到above 25
取消发出的事件
如果速度保持below 25
40 秒,则应在 20 秒和 40 秒打印两次位置。
当前的问题是:如果速度低于 25 并且在 20 秒内 observable 接收到第二个速度低于 25 的事件,它会取消之前的事件,因为 debounce
。
【问题讨论】:
【参考方案1】:您应该添加 distinctUntilChanged 运算符:
location.distinctUntilChanged $0.speed < 25 && $1.speed < 25
.debounce(.seconds(20), scheduler: MainScheduler.instance)
.filter $0.speed < 25
.subscribe(onNext: location in
print(location)
)
.disposed(by: disposeBag)
编辑 如果速度小于 25,则应每 20 秒打印一次位置的情况:
let isSpeedBelow = location
.distinctUntilChanged $0.speed < 25 && $1.speed < 25
.flatMapLatest location -> Observable<Double> in
if location.speed >= 25
return Observable.just(location)
return Observable<Int>.timer(.seconds(10), period: nil, scheduler: MainScheduler.instance)
.map _ in location.speed
.map $0 < 25
.startWith(true)
Observable<Int>.timer(.seconds(10), period: .seconds(10), scheduler: MainScheduler.instance)
.withLatestFrom(isSpeedBelow)
.filter $0
.withLatestFrom(location)
.subscribe(onNext: location in
print(location)
)
.disposed(by: disposeBag)
【讨论】:
如果速度低于 25 持续 40 秒,则应打印两次位置。 20 秒一次,40 秒一次。那么它会起作用吗? @DaniyalRaza 那么你应该使用计时器。我已经编辑了答案,请检查它以上是关于哪个 RxSwift 运算符用于唯一发出的元素以及如何使用?的主要内容,如果未能解决你的问题,请参考以下文章
在 RxSwift 中具有来自 Observable 的最后两个元素的运算符