首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将信号阵列合并为单个信号ReactiveCocoa 4

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

Stack Overflow用户
提问于 2015-12-09 15:51:17
回答 1查看 2.3K关注 0票数 2

在我的设置中,我有一个由多个GridView组成的GridViewCell,每个单元都有一个UITapGestureRecognizer

为了方便起见,GridView有以下函数func cellsTapGestureRecognizers() -> [UITapGestureRecognizer?],它返回其所有单元格的UITapGestureRecognizers (如果它们存在的话)。

在使用UIViewControllerGridView中,我的目标是将水龙头作为Signal来处理。我成功地做到了这一点,但有一个限制,就是为每个GridViewCell创建一个Signal,这似乎是不必要的。

代码语言:javascript
复制
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()中创建的所有信号,以便最终只剩下一个Signal<Position, NoError>类型的信号?

我查看了文档,但只找到了如何使用flatten(.Merge)合并SignalProducers的方法。是否有类似的方法可以合并一个Array of Signals。

请注意,上面函数中使用的gestureSignalView()返回一个Signal<UIView, NoError>,其中包含UITapGestureRecognizerUIView (灵感来自@NachoSoto的要旨)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-09 16:40:39

RAC Github回购公司中搜索后,我自己找到了解决方案。

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

所以,我可以做以下几点:

代码语言:javascript
复制
let signals = createTapSignals()
let mergedSignal = Signal.merge(signals)

作为参考,下面是merge的实现方式:

代码语言:javascript
复制
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
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34183146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档