如何从可观察数组中创建数组的可观察对象?

Pau*_*aul 29 arrays swift rx-swift

我有一个Thing对象数组,我想ConvertedThing使用返回的异步函数转换为对象Observable<ConvertedThing>.

我想创建一个Observable<[ConvertedThing]>在所有转换完成后发出一个值.

如何实现这一目标?任何帮助非常感谢!

ken*_*ytm 36

您可以使用.merge()将可观察数组合并到单个可观察对象中,然后使用.toArray()它们将它们作为单个事件中的列表.

对于RxSwift 3+使用:

let arrayOfObservables: [Observable<E>] = ...
let singleObservable: Observable<E> = Observable.from(arrayOfObservables).merge()
let wholeSequence: Observable<[E]> = singleObservable.toArray()
Run Code Online (Sandbox Code Playgroud)

对于以前的版本:

let arrayOfObservables: [Observable<E>] = ...
let singleObservable: Observable<E> = arrayOfObservables.toObservable().merge()
let wholeSequence: Observable<[E]> = singleObservable.toArray()
Run Code Online (Sandbox Code Playgroud)


red*_*t84 23

对于未来的读者:

当所有可观察序列完成时,使用.merge().toArray()将发出单个元素.如果任何可观察物不断发射,则不会发射或完成.

每次任何可观察的更改时,使用.combineLatest()将返回Observable发出完整列表的内容:

let arrayOfObservables: [Observable<E>] = ...
let wholeSequence: Observable<[E]> = Observable.combineLatest(arrayOfObservables) { $0 }
Run Code Online (Sandbox Code Playgroud)

  • 感谢指出,“可观察”细节的完成与否有很大的不同。kennytm的解决方案仅在您的“可观察性”完成时才有效;否则使用`combineLatest()`。 (2认同)