RxSwift 中可观察集合中的平面映射可观察属性
Flat mapping observable properties in a observable collection in RxSwift
使用 RxSwift,假设我有一个 class A,其中包含一个整数
class A: {
let count: Observable<Int>
}
以及 A
对象的可观察集合
let data: Observable<[A]>
我想定义一个 sum: Observable<Int>
,它将是 data
中所有对象的所有 count
的总和。每当 data
可观察集合发生变化或任何 count
属性 发生变化时,sum
也应该发生变化。
如何实现?我尝试了一些 flapMap
和 map
组合,但只有当 sum
仅在 data
更新时更新时才得到解决方案,忽略 count
更改。
let sum = data.flatMap { Observable.from([=10=]).flatMap { [=10=].count }.reduce(0, accumulator: +) }
'.reduce()' 仅在完成时发出,因此它必须在外部 '.flatMap()'
的内部
更新 1:
let sumSubject: BehaviorSubject<Observable<Int>> = BehaviorSubject.create(Observable.empty())
let sum = sumSubject.switchLatest()
// every time it has to be a new 'data' observable!
sumSubject.onNext(data.flatMap { Observable.from([=11=]).flatMap { [=11=].count }.reduce(0, accumulator: +) })
更新二:
let counts: Observable<[Int]> = data.flatMap { Observable.combineLatest([=12=].map { [=12=].count }) }
let sum: Observable<Int> = counts.map { [=12=].reduce(0) { [=12=] + } }
使用 RxSwift,假设我有一个 class A,其中包含一个整数
class A: {
let count: Observable<Int>
}
以及 A
对象的可观察集合let data: Observable<[A]>
我想定义一个 sum: Observable<Int>
,它将是 data
中所有对象的所有 count
的总和。每当 data
可观察集合发生变化或任何 count
属性 发生变化时,sum
也应该发生变化。
如何实现?我尝试了一些 flapMap
和 map
组合,但只有当 sum
仅在 data
更新时更新时才得到解决方案,忽略 count
更改。
let sum = data.flatMap { Observable.from([=10=]).flatMap { [=10=].count }.reduce(0, accumulator: +) }
'.reduce()' 仅在完成时发出,因此它必须在外部 '.flatMap()'
的内部更新 1:
let sumSubject: BehaviorSubject<Observable<Int>> = BehaviorSubject.create(Observable.empty())
let sum = sumSubject.switchLatest()
// every time it has to be a new 'data' observable!
sumSubject.onNext(data.flatMap { Observable.from([=11=]).flatMap { [=11=].count }.reduce(0, accumulator: +) })
更新二:
let counts: Observable<[Int]> = data.flatMap { Observable.combineLatest([=12=].map { [=12=].count }) }
let sum: Observable<Int> = counts.map { [=12=].reduce(0) { [=12=] + } }