使用 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 事件。
您可以结合使用 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:这会阻止 Switch 发出其初始值。如果你需要 UISwitch
的初始值,你可以删除它
// 2:等待 UISwitch
至少 1 秒未更改其值,然后再发出新值
// 3:这会过滤掉没有改变的值。因此,如果在一秒钟不活动后开关的值与用户开始更改值之前相同,则不会发出任何值。
我有一个正在切换的布尔变量 true/false。我需要忽略任何不到 1 秒的变化。换句话说,我只需要保持超过 1 秒的值。如何从 RxSwift 获得这样的输出?
示例 1:如果值为 true,然后更改为 false,然后在 0.5 秒后再次变为 true,我需要我的输出序列不显示任何内容。
示例 2:上面的场景在 false 和 true 之间有 1.2 秒的延迟,在我的输出序列中产生了一个 false 事件。
您可以结合使用 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:这会阻止 Switch 发出其初始值。如果你需要 UISwitch
// 2:等待 UISwitch
至少 1 秒未更改其值,然后再发出新值
// 3:这会过滤掉没有改变的值。因此,如果在一秒钟不活动后开关的值与用户开始更改值之前相同,则不会发出任何值。