gpt4 book ai didi

ios - ReactiveCocoa - 停止触发 subscribeNext 直到另一个信号完成

转载 作者:搜寻专家 更新时间:2023-10-31 23:02:00 24 4
gpt4 key购买 nike

我是 FRP 的新手,我遇到了一个问题:

我订阅了一个每秒触发 subscribeNext 的 observable。

subscribeNext 的 block 中,我 zip 执行异步操作的可观察对象,并在 zipcompleted 阻止我对结果执行操作。

let signal: RACSignal
let asynchOperations: [RACSignal]
var val: AnyObject?

// subscribeNext is trigered every second
signal.subscribeNext {
let asynchOperations = // several RACSignal

// Perform asynchronous operations
RACSignal.zip(asynchOperations).subscribeNext({
val = $0
}, completed: {
// perform actions with `val`
})
}

我想停止触发signalsubscribeNext(通常每秒触发一次)直到完成(从zip) 已到达。

有什么建议吗?

最佳答案

听起来您想要一个 RACCommand

命令是一个可以执行异步操作的对象,但一次只能运行其操作的一个实例。一旦您告诉命令开始execute:ing,它将变为“禁用”,并在操作完成时自动再次启用。

(您还可以创建一个基于其他标准启用的命令,而不仅仅是“我现在正在执行”,但听起来您在这里不需要它。)

一旦你有了它,你就可以得到一个“门控”间隔信号的信号(例如,命令的上的if:then:else: enabled 信号在 RACSignal.empty 和你的实际信号之间切换——我这样做已经够多了,我有一个帮助程序),或者你可以检查 canExecute 在您的订阅 block 中调用 execute: 之前的属性。


注意:您在那里对内部订阅做了一件有点奇怪的事情——捕获值,然后处理已完成 block 上的值。

如果您这样做是因为它更明确,并且您知道信号只会发送一个值,但您觉得需要直接对其进行编码,那很好。不过,我认为这不是标准的——如果你有一个只会发送一个值的信号,不幸的是,这是无法在类型级别表示的东西,但仍然是你可以在代码中做出的一个假设(或者至少,我发现自己对这个假设很满意。对每个人来说)。

但是,如果您出于时间原因这样做,或者因为您实际上只想从信号发送 last 值,则可以使用 takeLast:1 来代替得到一个总是在内部信号完成时发送一个值的信号,然后只在 next block 中订阅。


一点警告:RACCommand 旨在从主线程用于支持 UI 更新;如果你想在后台线程上使用命令,你需要明确调度程序来传递你的信号(查看文档以获取更多详细信息)。


获得类似行为的另一种完全不同的方法是时间递归:执行您的操作,然后在操作完成后安排该操作在一秒钟后再次发生,而不是让一个持续的计时器。

这略有不同,因为您总是在操作之间等待一秒钟,而在当前操作中,您可以等待 0 到 1 秒之间的任何时间,但如果这不是问题,那么这是比使用 RACCommand 简单得多的解决方案。

ReactiveCocoa 的 delay: 方法使这种临时调度非常方便——这里没有手动 NSTimer 争论。

关于ios - ReactiveCocoa - 停止触发 subscribeNext 直到另一个信号完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32611886/

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