合并一个未知数量的Observable

时间:2015-11-30 17:00:07

标签: swift generics swift2 rx-swift

我正在使用RxSwift。我有一个文本字段数组,取决于哪个UI可见;它可以在数组中有1,3或4个文本字段。

迭代数组,我为每个数组创建信号,将其映射到一个布尔值,指示该字段是否有效。

let textFields: [UITextField] = ...
var signals: [Observable<Bool>] = []
textFields.forEach { tf in
     let sig = tf.rx_text
                 .map { string in
                        return string.length > 0
                 }
     signals.append(sig)
}

通常,为了组合多个信号,我会使用具有多个变量的combineLatest来获取不同数量的参数,如果我有三个信号,通常会看起来像这样

_ = combineLatest(sig1, sig2, sig3) { $0 }
        .subscribeNext { [weak self] valid in
            self!.someButton.enabled = valid
        }
        .addDisposableTo(disposeBag)

当组合信号的数量未知时,有没有办法组合信号?

或者,有没有办法编写一个具有可变数量的泛型参数的函数?我认为这将是编写一个函数来组合多个信号而不知道多少信号的起点。

2 个答案:

答案 0 :(得分:1)

我提出了一个似乎有效的通用解决方案,但正确考虑传入空数组的情况除外。

func combineSignals<T>(signals: [Observable<T>], combine: (T,T)->T ) -> Observable<T> {
    assert (signals.count >= 1)
    guard signals.count >= 2 else { return signals[0] }

    var comb = combineLatest(signals[0], signals[1]) { combine($0) }
    for i in 2..<signals.count {
        comb = combineLatest(comb, signals[i]) { combine($0) }
    }
    return comb
}

答案 1 :(得分:0)

我猜你可以找到答案here

实际上在RxExaples中我找到了很多答案。他们在那里涵盖了许多comon问题