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

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

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

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


person Paul    schedule 04.02.2016    source источник


Ответы (2)


Вы можете использовать .merge(), чтобы объединить массив наблюдаемых объектов в один наблюдаемый объект, а затем использовать < a href="http://reactivex.io/documentation/operators/to.html" rel="noreferrer">.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()
person kennytm    schedule 04.02.2016
comment
Моя отправная точка — это массив наблюдаемых, а не один. Итак, я хочу перейти от [Observable<ConvertedThing>] к Observable<[ConvertedThing]>. - person Paul; 04.02.2016
comment
@Пол: Извини. Обновлено. - person kennytm; 04.02.2016

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

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

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

let arrayOfObservables: [Observable<E>] = ...
let wholeSequence: Observable<[E]> = Observable.combineLatest(arrayOfObservables) { $0 }
person redent84    schedule 24.02.2017
comment
Детали завершения Observable имеют такое большое значение, спасибо за указание. решение kennytm будет работать только в том случае, если ваши Observables завершаются; в противном случае используйте combineLatest(). - person Guven; 21.01.2019