【问题标题】:Combining an unkown number of Observables组合未知数量的 Observables
【发布时间】:2015-11-30 17:00:06
【问题描述】:

我正在使用 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)

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

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

【问题讨论】:

    标签: swift generics swift2 rx-swift


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

      我猜你可以找到答案here

      实际上在 RxExaples 中我找到了很多答案。他们在那里解决了很多常见问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多