我有速度观察器看起来像这样(这是描述问题的简单版本):
class SpeedManager {
var speed = Variable(0.0)
private var limit = 0.2
func speedObserver() -> Observable<Bool> {
return speed.asObservable().map{$0 >= self.limit}
}
}
我的所作所为我只是在达到限制时验证速度。
所以我收到了这种流:
比我这样做:
let speedManager = SpeedManager()
let observable = speedManager.speedObserver().distinctUntilChanged()
observable
将返回此类流:
所以我只需添加一个步骤来验证observable
事件是否为true
并且在10秒内为真。
基本上如果observable
下一个事件是true
,我应该等待10秒钟来验证下一个事件是否不是false
。
答案 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
在这种情况下不太适合,阅读他们的描述以充分了解他们的可能性。