【问题标题】:ReactiveCocoa - Stop the triggering of subscribeNext until another signal has been completedReactiveCocoa - 停止触发 subscribeNext 直到另一个信号完成
【发布时间】:2015-09-16 14:45:22
【问题描述】:

我对 FRP 很陌生,但遇到了一个问题:

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

subscribeNext 的块中,我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`
  })
}

我想停止为signal 触发subscribeNext(通常每秒触发一次),直到达到completed(来自zip)。

有什么建议吗?

【问题讨论】:

  • 你有什么理由选择 RAC2,RAC3 更适合 swift
  • RAC3 适用于 iOS8+,我需要兼容 iOS7。
  • 订阅信号中的信号几乎总是一种代码味道。尝试将外部信号平面映射到内部信号。这不会解决您的问题,但只是一般 RAC 提示。

标签: ios swift reactive-programming reactive-cocoa


【解决方案1】:

听起来你想要RACCommand

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

(除了“我现在正在执行”之外,您还可以根据其他条件创建一个启用的命令,但听起来您在这里不需要。)

一旦你有了它,你可以导出一个“门”间隔信号的信号(例如,命令的enabled信号上的if:then:else:RACSignal.empty和你的实际信号之间切换-- 我这样做已经足够了,我有一个助手),或者你可以在你的订阅块中调用execute: 之前检查canExecute 属性。


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

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

但如果您出于时间原因这样做,或者因为您实际上只想要从信号发送的 last 值,则可以使用takeLast:1 来获取始终发送的信号在内部信号完成的那一刻正好有一个值,然后只订阅next 块。


轻微警告:RACCommands 旨在从主线程用于支持 UI 更新;如果您想在后台线程上使用命令,您需要明确说明调度程序以传递您的信号(查看文档了解更多详细信息)。


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

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

ReactiveCocoa 的delay: 方法使这种临时调度非常方便——这里无需手动NSTimer 争吵。

【讨论】:

  • 感谢您的完整解释!我不知道 RACCommand。最后经过少量研究,我最终这样做了:我用map:concat 方法包装了zip 操作,并在subscribeNextmap: 和@ 之后使用val 执行所需的操作987654340@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多