组合未知数量的 Observable
Combining an unkown number of Observables
我正在使用 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) { [=11=] }
.subscribeNext { [weak self] valid in
self!.someButton.enabled = valid
}
.addDisposableTo(disposeBag)
当合并的信号数量未知时,是否有合并信号的方法?
或者,有没有一种方法可以编写具有可变数量的泛型参数的函数?我认为这将是编写一个函数以在不知道有多少信号的情况下组合多个信号的起点。
我提出了一个似乎有效的通用解决方案,除了正确考虑传入空数组的情况。
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([=10=]) }
for i in 2..<signals.count {
comb = combineLatest(comb, signals[i]) { combine([=10=]) }
}
return comb
}
我想你能找到答案here
其实在RxExaples中我找到了很多答案。他们在那里涵盖了很多常见问题
我正在使用 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) { [=11=] }
.subscribeNext { [weak self] valid in
self!.someButton.enabled = valid
}
.addDisposableTo(disposeBag)
当合并的信号数量未知时,是否有合并信号的方法?
或者,有没有一种方法可以编写具有可变数量的泛型参数的函数?我认为这将是编写一个函数以在不知道有多少信号的情况下组合多个信号的起点。
我提出了一个似乎有效的通用解决方案,除了正确考虑传入空数组的情况。
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([=10=]) }
for i in 2..<signals.count {
comb = combineLatest(comb, signals[i]) { combine([=10=]) }
}
return comb
}
我想你能找到答案here
其实在RxExaples中我找到了很多答案。他们在那里涵盖了很多常见问题