gpt4 book ai didi

swift - 如何观察 bool 值流并延迟值变化?

转载 作者:行者123 更新时间:2023-11-28 06:06:39 28 4
gpt4 key购买 nike

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

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

最佳答案

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

So I just need to add step that will validate if observable event is true and it is true during 10 seconds.

它描述了两种情况:

  • 只有第一个 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 observable

observableEnumeratedFalse - 只接受 false 枚举事件

然后你只接受 true 事件。将它们每个延迟 10 秒。在延迟之后,您从 false 枚举可观察对象中获取最后一个值。如果最后一个 false 事件的索引低于当前延迟的 true 事件 - 这就是您所需要的。

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

关于swift - 如何观察 bool 值流并延迟值变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47994787/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com