【问题标题】:ReactiveCocoa combine SignalProducers into oneReactiveCocoa 将 SignalProducers 合二为一
【发布时间】:2015-11-19 13:04:44
【问题描述】:

我正在使用 ReactiveCocoa,并且我有几个 SignalProducers

let center = NSNotificationCenter.defaultCenter()
let signalProducer1 = center.rac_notification(name: notificationName1, object: nil)
let signalProducer2 = center.rac_notification(name: notificationName2, object: nil)
let signalProducer3 = center.rac_notification(name: notificationName3, object: nil)

我想将它们组合成一个信号生成器,只要其中一个生成信号,它就会生成一个信号。

起初combineLatest 函数看起来是个不错的解决方案

let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3)

但是,根据this article 的说法,生成的生产者仅在三个都产生信号时才产生其第一个信号。

This interactive diagram 正是我想要的,所以我想将flatten 函数与.Merge FlatteningStrategy 一起使用。但是,我很难弄清楚实现这一点的语法。

【问题讨论】:

标签: ios swift reactive-cocoa reactive-cocoa-3


【解决方案1】:

更新:RAC 4.2.1 及更高版本

由于changes in how flatten works,我们需要帮助编译器更明确地了解类型:

let s1: SignalProducer<Int, NSError> = ...
let s2: SignalProducer<Int, NSError> = ...
let s3: SignalProducer<Int, NSError> = ...


let _: SignalProducer<Int, NSError> =
    SignalProducer<SignalProducer<Int, NSError>, NSError>(values: [s1, s2, s3])
        .flatten(.Merge)

这变得有点麻烦,所以你可能想要拆分它:

let producers: SignalProducer<SignalProducer<Int, NSError>, NSError> =
    SignalProducer(values: [s1, s2, s3])

let merged: SignalProducer<Int, NSError> = x.flatten(.Merge)

感谢@Harry 指出新版本问题的评论。


RAC 4.2 及以下

在 RAC 4 中

let merged = SignalProducer(values: [signalProducer1, signalProducer2, signalProducer3])
  .flatten(.Merge)

目前 Xcode 7.1.1 不会在自动完成窗口中建议 .flatten,这可能会导致您(或只是我)认为它不存在,但如果您键入它一切都会好起来的。

【讨论】:

  • 这似乎不再适用于 ReactiveCocoa 4.2.1 及更高版本
  • 抱歉回到我之前的评论,但这个问题实际上已在 4.2.2 中修复。我相信问题本身是在 4.2.0 中引入的。
  • 嗨@Harry,我仍然看到这个问题,而且我实际上正在使用master,所以版本5.0。有什么想法吗?
【解决方案2】:

您可以通过以下方式实现:

let merged = SignalProducer(values: [ signalProducer1, signalProducer2, signalProducer3 ])
    |> flatten(.Merge)

【讨论】:

  • 你会如何在 ReactiveCocoa 4 中做到这一点?
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 2016-04-27
  • 2020-08-25
  • 1970-01-01
  • 2015-12-30
  • 2019-05-26
  • 2012-10-21
  • 2020-08-19
相关资源
最近更新 更多