如何将信号阵列合并为单个Signal ReactiveCocoa 4

时间:2015-12-09 15:51:17

标签: ios swift reactive-cocoa

在我的设置中,我有GridView,其中包含许多GridViewCell个。每个单元格都有一个UITapGestureRecognizer

为方便起见,GridView具有以下功能 func cellsTapGestureRecognizers() -> [UITapGestureRecognizer?] 返回其所有单元格的UITapGestureRecognizer(如果存在)。

在使用UIViewController的{​​{1}}中,我的目标是将点击视为GridView。我设法做到了这一点,但有限制我为每个Signal创建了一个Signal,这似乎是不必要的。

GridViewCell

是否可以合并func createTapSignals() -> [Signal<Position, NoError>?] { var signals: [Signal<Position, NoError>] = [] for maybeTap in self.gridView.cellsTapGestureRecognizers() { if let tap = maybeTap { let signal = tap.gestureSignalView() .map { $0 as! GridViewCell } .map {$0.position} signals.append(signal) } } return signals } 中创建的所有信号,以便最终只剩下createTapSignals()类型的一个信号?

我查看了documentation,但只找到了使用Signal<Position, NoError>合并SignalProducers的方法。是否有类似的方法可以合并flatten(.Merge) Array s。

请注意,上述函数中使用的Signal会返回gestureSignalView(),其中包含Signal<UIView, NoError>的{​​{1}}(受@ NachoSoto&{39; s {{的启发3}})。

1 个答案:

答案 0 :(得分:8)

我在RAC Github repo搜索后找到了解决方案。

(静态)函数merge正是我正在寻找的。它是SignalType协议(Signal符合)的一部分,并在协议扩展中实现。

所以,我可以做以下事情:

let signals = createTapSignals()
let mergedSignal = Signal.merge(signals)

供参考,以下是merge的实施方式:

public static func merge<S: SequenceType where S.Generator.Element == Signal<Value, Error>>(signals: S) -> Signal<Value, Error> {
    let producer = SignalProducer<Signal<Value, Error>, Error>(values: signals)
    var result: Signal<Value, Error>!

    producer.startWithSignal { (signal, _) in
        result = signal.flatten(.Merge)
    }

    return result
}