RxSwift - 如何将 Observables 相互附加?
RxSwift - How to append Observables with each other?
我在 RxSwift 中累积 Observable 时遇到了问题。澄清一下,我有很多艺术家。对于每个艺术家,我正在调用一个函数,该函数以 "Observable<[NewTrack]>" 的形式 returns 艺术家的曲目。最后,我想要一个可观察到的累积的 Newtracks,"Observable<[NewTrack]>"。
更一般地说,如何使用 Observables 模拟将项目附加到数组?我的解决方案是下面的代码,我在其中创建了一个 behaviorRelay 来监视数组的状态并在每次迭代时不断更新它。但是我得到的最终结果不是我所期望的:返回的 Observable<[NewTrack]> 只包含数组中最后一位艺术家的曲目。我认为我的问题可能与我还想在两个可观察对象中连接两个数组这一事实有关。
let observable = BehaviorRelay<Observable<[NewTrack]>>(value: Observable<[NewTrack]>.empty())
for artist in artists {
let newTracks = self.sessionService.getNewTracksForArtist(artist: artist)
let currentTracks = observable.value
observable.accept(Observable.concat(currentTracks, newTracks))
}
return observable.value
好的,我把流程画出来后,我意识到我得到的串联结果是“[[Artist1Tracks], [Artist2Tracks]]”。我想要的是“[Artist1Tracks+Artist2Tracks]”。值得庆幸的是,有一个完美的操作符可以做到这一点:扫描。它就像 reduce 但也会发出每个中间值。我所做的只是添加到连接行:
observable.accept(Observable.concat(currentTracks, newTracks).scan([], accumulator: +))
实际上,这连接了数组中的所有数组实例。
我在 RxSwift 中累积 Observable 时遇到了问题。澄清一下,我有很多艺术家。对于每个艺术家,我正在调用一个函数,该函数以 "Observable<[NewTrack]>" 的形式 returns 艺术家的曲目。最后,我想要一个可观察到的累积的 Newtracks,"Observable<[NewTrack]>"。
更一般地说,如何使用 Observables 模拟将项目附加到数组?我的解决方案是下面的代码,我在其中创建了一个 behaviorRelay 来监视数组的状态并在每次迭代时不断更新它。但是我得到的最终结果不是我所期望的:返回的 Observable<[NewTrack]> 只包含数组中最后一位艺术家的曲目。我认为我的问题可能与我还想在两个可观察对象中连接两个数组这一事实有关。
let observable = BehaviorRelay<Observable<[NewTrack]>>(value: Observable<[NewTrack]>.empty())
for artist in artists {
let newTracks = self.sessionService.getNewTracksForArtist(artist: artist)
let currentTracks = observable.value
observable.accept(Observable.concat(currentTracks, newTracks))
}
return observable.value
好的,我把流程画出来后,我意识到我得到的串联结果是“[[Artist1Tracks], [Artist2Tracks]]”。我想要的是“[Artist1Tracks+Artist2Tracks]”。值得庆幸的是,有一个完美的操作符可以做到这一点:扫描。它就像 reduce 但也会发出每个中间值。我所做的只是添加到连接行:
observable.accept(Observable.concat(currentTracks, newTracks).scan([], accumulator: +))
实际上,这连接了数组中的所有数组实例。