ReactiveCocoa将SignalProducers合二为一

我正在使用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) 

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

起初, combineLatestfunction看起来是一个很好的解决方案

 let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3) 

但是,根据这篇文章 ,生成的生产者只有在三者都产生信号时才产生第一个信号。

这个交互式图表显示了我想要的内容,因此我想使用.Merge FlatteningStrategy的flatten函数。 但是,我很难搞清楚实现这一目的的语法。

您可以按如下方式实现:

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

更新:RAC 4.2.1及更高版本

由于flatten工作方式的变化,我们需要帮助编译器更清楚地了解类型:

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

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

 let producers: SignalProducer, NSError> = SignalProducer(values: [s1, s2, s3]) let merged: SignalProducer = x.flatten(.Merge) 

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


RAC 4.2及以下

在RAC 4中,这将是

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

目前,Xcode 7.1.1并未在自动完成窗口中建议使用.flatten ,这可能会导致您( 或仅仅是我 )认为它不在那里,但如果您输入它,它将起作用。