ReactiveCocoa 将 SignalProducers 合二为一
ReactiveCocoa combine SignalProducers into one
我正在使用 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 一起使用。但是,我很难弄清楚实现此目的的语法。
您可以通过以下方式实现:
let merged = SignalProducer(values: [ signalProducer1, signalProducer2, signalProducer3 ])
|> flatten(.Merge)
更新: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 在自动完成 window 中不建议 .flatten
,这可能会导致你(或只有我) 认为它不存在,但如果你全部输入它就会起作用。
我正在使用 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 一起使用。但是,我很难弄清楚实现此目的的语法。
您可以通过以下方式实现:
let merged = SignalProducer(values: [ signalProducer1, signalProducer2, signalProducer3 ])
|> flatten(.Merge)
更新: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 在自动完成 window 中不建议 .flatten
,这可能会导致你(或只有我) 认为它不存在,但如果你全部输入它就会起作用。