2017-08-25 222 views
0

使用RxSwift,说我有一个包含可观察到的整数平映射在观察集合观察到的性质RxSwift

class A: { 
    let count: Observable<Int> 
} 

和的

let data: Observable<[A]> 

对象的观察集合A类我想定义一个sum: Observable<Int>,它将是data中所有对象的所有count的总和。每当data可观察收集更改或任何count属性更改时,sum也应该更改。

如何实现这一目标?我试了一些flapMapmap的组合,但只有当sum得到更新时才得到解决方案,只有当data得到更新时,忽略count的更改。

回答

0
let sum = data.flatMap { Observable.from($0).flatMap { $0.count }.reduce(0, accumulator: +) } 

'降低()' 发出仅在完成,所以它必须是外 '.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($0).flatMap { $0.count }.reduce(0, accumulator: +) }) 

更新2:

let counts: Observable<[Int]> = data.flatMap { Observable.combineLatest($0.map { $0.count }) } 
    let sum: Observable<Int> = counts.map { $0.reduce(0) { $0 + $1 } } 
+0

这对我来说只是0。编辑之前的版本显示了正确的值,但当count更新时没有发出新的版本。 –

+0

尝试在每个操作员之后添加'.debug()'以确定每个操作员上游的完成位置。基本上,'.reduce()'仅在上游完成时发射,而在每个上游项目上发射'.scan()'。如果一切都失败,请尝试'BehaviourSubject >'上的'.switchLatest()',您将使用新的'Observable.just([A(),A(),...)''' –

+0

'通过扫描(在编辑之前的版本),它会在发生变化时继续添加数字,而不是再次计算。就像计数从1变到2时一样,结果将不是2而是3(1 + 2)。 –