Игнорирование быстрых изменений в логической переменной с помощью RxSwift - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть логическая переменная, которая переключает true / false. Мне нужно игнорировать любые изменения, которые устанавливаются менее чем за 1 секунду. Другими словами, мне нужны только значения, которые остаются более 1 секунды. Как получить такой вывод из RxSwift?

Sample1: Если значение равно true и изменяется на false, а затем через 0,5 секунды снова становится true, мне нужна моя выходная последовательность, чтобы ничего не показывать.

Пример 2: Приведенный выше сценарий с задержкой в ​​1,2 секунды между ложью и истиной создает ложное событие в моей выходной последовательности.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать комбинацию skip, debounce и distinctUntilChanged для достижения этого:

aSwitch.rx.isOn
    .skip(1) // 1
    .debounce(1, scheduler: MainScheduler.instance) // 2
    .distinctUntilChanged() // 3
    .subscribe(onNext: { isOn in
        print("IS ON: \(isOn)")
    })
    .disposed(by: disposeBag)

Небольшое объяснение:

// 1: Это предотвращает излучение коммутатором своего начального значения. Вы можете удалить это, если вам нужно начальное значение UISwitch

// 2: ожидание до тех пор, пока UISwitch не изменит свое значение в течение как минимум 1 секунды, прежде чем выдать новое значение

// 3: отфильтровывает значения, которые не изменились. Таким образом, значение не выдается, если после одной секунды бездействия значение переключателя остается таким же, как до того, как пользователь начал изменять значение.

...