如何通过延迟值变化来观察bool值流?

时间:2017-12-27 15:35:15

标签: swift reactive-programming rx-swift reactive

我有速度观察器看起来像这样(这是描述问题的简单版本):

class SpeedManager {
    var speed = Variable(0.0)
    private var limit = 0.2

    func speedObserver() -> Observable<Bool> {
        return speed.asObservable().map{$0 >= self.limit}
    }
}

我的所作所为我只是在达到限制时验证速度。

所以我收到了这种流:

假-----&GT;真&----- GT;假&----- GT;真&----- GT;真&----- GT;真&----- GT真

比我这样做:

let speedManager = SpeedManager()

let observable = speedManager.speedObserver().distinctUntilChanged()

observable将返回此类流:

假-----&GT;真&----- GT;假&----- GT;真&----- GT;假&----- GT;真-----&GT;假

所以我只需添加一个步骤来验证observable事件是否为true并且在10秒内为真。

基本上如果observable下一个事件是true,我应该等待10秒钟来验证下一个事件是否不是false

1 个答案:

答案 0 :(得分:1)

你的问题不是很清楚。让我解释。你写道:

  

所以我只需要添加将验证observable事件是否的步骤   是的,在10秒内是真的。

它描述了两种情况:

  • 只有第一个true事件才会被视为触发10秒计时器。每个下一个true事件都会被忽略,并且在false事件取消计时器之前不会产生计时器。
  • 每个true事件应生成observable,等待任何false事件的时间为10秒,如果false未发生,则会发生您的可观察事件。

第一种情况很简单:

let observable1 = observable
    .debounce(10, scheduler: MainScheduler.instance)
    .filter({ $0 == true })
    .share(replay: 1, scope: SubjectLifetimeScope.whileConnected)

第二种情况更难:

let observableEnumerated = observable
    .scan((false, 0)) { (value, next) -> (Bool, Int) in
        return (next, value.1 + 1)
    }
    .share(replay: 1, scope: SubjectLifetimeScope.whileConnected)
let observableEnumeratedFalse = observableEnumerated
    .filter({ $0.0 == false })
    .share(replay: 1, scope: SubjectLifetimeScope.whileConnected)
let observable1 = observableEnumerated
    .filter({ $0.0 == true })
    .delay(10, scheduler: MainScheduler.instance)
    .withLatestFrom(observableEnumeratedFalse){(trueIndex: $0.1, falseIndex: $1.1)}
    .filter({ $0.trueIndex > $0.falseIndex })
    .share(replay: 1, scope: SubjectLifetimeScope.whileConnected)

observableEnumerated - 只列举您的Bool可观察

observableEnumeratedFalse - 仅采用false个枚举事件

然后您只参加true个活动。将它们延迟10秒钟。延迟之后,您从false枚举的observable中取出最后一个值。如果上一个false事件的索引低于当前延迟的true事件,那么这就是您所需要的。

第二种情况没有经过测试,只是展示了处理任务的方法。大多数情况下,使用debounce的第一个解决方案将是您的选择。顺便说一下,throttle在这种情况下不太适合,阅读他们的描述以充分了解他们的可能性。