ReactiveCocoa将SignalProducers合二为一

时间:2015-08-25 17:37:40

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

我使用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一起使用。但是,我很难找到实现此目的的语法。

2 个答案:

答案 0 :(得分:15)

更新: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,这可能会导致你(或只是我)认为它不存在,但如果你输入一切就可以了。

答案 1 :(得分:10)

您可以按如下方式实现:

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