Как создать наблюдаемый массив из массива наблюдаемых?
У меня есть массив объектов 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 }