在我的设置中,我有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}})。
答案 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
}