哪个 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 运算符?

iOS RxSwift - 如何使用 Amb 运算符?

RxSwift高阶函数merge解读

在 RxSwift 中具有来自 Observable 的最后两个元素的运算符

如何在 RxSwift 中延迟从 Collection 中逐一发出项目

RxSwift throttle() 获取第一个元素