Какой оператор RxSwift использовать для уникально излучаемых элементов и как? - PullRequest
0 голосов
/ 02 апреля 2020
location.filter({$0.speed < 25})
.debounce(.seconds(20), scheduler: MainScheduler.instance)
.subscribe(onNext: { (location) in
    print(location)
}).disposed(by: disposeBag)

Цели:

  1. Если свойство скорости остается ниже 25 for 20 seconds, то место печати
  2. Если within 20 секунд скорость идет above 25 отменить отправленное событие
  3. Если скорость остается below 25 в течение 40 секунд, местоположение должно быть напечатано дважды один раз через 20 секунд и снова через 40 секунд.

Текущая проблема: Если скорость опускается ниже 25 и в течение 20 секунд наблюдаемое получает второе событие со скоростью ниже 25, оно отменяет предыдущее событие из-за debounce.

1 Ответ

1 голос
/ 02 апреля 2020

Вы должны добавить оператор DifferentUntilChanged:

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)

РЕДАКТИРОВАТЬ Случай, когда местоположение должно печататься каждые 20 секунд, если скорость меньше 25:

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)
...