Как создать наблюдаемый массив из массива наблюдаемых?

У меня есть массив объектов Thing, которые я хочу преобразовать в объекты ConvertedThing, используя асинхронную функцию, которая возвращает Observable<ConvertedThing>.

Я хотел бы создать Observable<[ConvertedThing]>, который испускает одно значение, когда все преобразования завершены.

Как это можно сделать? Любая помощь очень ценится!

Ответы

Ответ 1

Вы можете использовать .merge(), чтобы объединить массив наблюдаемых в один наблюдаемый, а затем использовать .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()

Ответ 2

Для будущих читателей:

Используя .merge() и .toArray() будет излучать один элемент, когда все наблюдаемые последовательности будут завершены. Если какой-либо из наблюдаемых продолжает излучать, он не будет испускать или завершать.

Используя .combineLatest() вернет Observable, который испускает полный список при каждом наблюдаемом изменении:

let arrayOfObservables: [Observable<E>] = ...
let wholeSequence: Observable<[E]> = Observable.combineLatest(arrayOfObservables) { $0 }