【发布时间】:2016-05-14 09:33:50
【问题描述】:
我有一个 Thing 对象数组,我想使用返回 Observable<ConvertedThing> 的异步函数将其转换为 ConvertedThing 对象。
我想创建一个Observable<[ConvertedThing]>,它会在所有转换完成后发出一个值。
如何做到这一点?非常感谢任何帮助!
【问题讨论】:
我有一个 Thing 对象数组,我想使用返回 Observable<ConvertedThing> 的异步函数将其转换为 ConvertedThing 对象。
我想创建一个Observable<[ConvertedThing]>,它会在所有转换完成后发出一个值。
如何做到这一点?非常感谢任何帮助!
【问题讨论】:
对于未来的读者:
使用.merge() 和.toArray() 将在所有可观察序列完成时发出单个元素。如果任何 observables 持续发射,它不会发射或完成。
使用.combineLatest() 将返回一个Observable,每次发生任何可观察到的变化时都会发出完整列表:
let arrayOfObservables: [Observable<E>] = ...
let wholeSequence: Observable<[E]> = Observable.combineLatest(arrayOfObservables) { $0 }
【讨论】:
Observable 完成与否的细节影响很大,感谢您的指出。 kennytm 的解决方案仅在您的Observables 完成时才有效;否则使用combineLatest()。
您可以使用 .merge() 将 observable 数组组合成一个 observable,然后使用 .toArray() 在单个事件中将它们作为列表获取。
对于 RxSwift 3+ 使用:
let arrayOfObservables: [Observable<E>] = ...
let singleObservable: Observable<E> = Observable.from(arrayOfObservables).merge()
let wholeSequence: Observable<[E]> = singleObservable.toArray()
对于以前的版本:
let arrayOfObservables: [Observable<E>] = ...
let singleObservable: Observable<E> = arrayOfObservables.toObservable().merge()
let wholeSequence: Observable<[E]> = singleObservable.toArray()
【讨论】:
[Observable<ConvertedThing>] 到Observable<[ConvertedThing]>。