使用 RxSwift 忽略布尔变量的快速变化

Ignoring fast changes on a Boolean variable with RxSwift

我有一个正在切换的布尔变量 true/false。我需要忽略任何不到 1 秒的变化。换句话说,我只需要保持超过 1 秒的值。如何从 RxSwift 获得这样的输出?

示例 1:如果值为 true,然后更改为 false,然后在 0.5 秒后再次变为 true,我需要我的输出序列不显示任何内容。

示例 2:上面的场景在 false 和 true 之间有 1.2 秒的延迟,在我的输出序列中产生了一个 false 事件。

您可以结合使用 skipdebouncedistinctUntilChanged 来实现:

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:这会阻止 Switch 发出其初始值。如果你需要 UISwitch

的初始值,你可以删除它

// 2:等待 UISwitch 至少 1 秒未更改其值,然后再发出新值

// 3:这会过滤掉没有改变的值。因此,如果在一秒钟不活动后开关的值与用户开始更改值之前相同,则不会发出任何值。