web-dev-qa-db-fra.com

Comment créer un observable d'un tableau à partir d'un tableau d'observables?

J'ai un tableau d'objets Thing que je souhaite convertir en objets ConvertedThing, à l'aide d'une fonction asynchrone qui renvoie Observable<ConvertedThing>.

Je voudrais créer un Observable<[ConvertedThing]> qui émet une valeur lorsque toutes les conversions sont terminées.

Comment cela peut-il être accompli? Toute aide très appréciée!

28
Paul

Vous pouvez utiliser .merge() pour combiner le tableau des observables en un seul observable, puis utiliser .toArray() pour les obtenir en tant que liste en un seul événement.

Pour l'utilisation de RxSwift 3+:

let arrayOfObservables: [Observable<E>] = ...
let singleObservable: Observable<E> = Observable.from(arrayOfObservables).merge()
let wholeSequence: Observable<[E]> = singleObservable.toArray()

Pour les versions précédentes:

let arrayOfObservables: [Observable<E>] = ...
let singleObservable: Observable<E> = arrayOfObservables.toObservable().merge()
let wholeSequence: Observable<[E]> = singleObservable.toArray()
35
kennytm

Pour les futurs lecteurs:

L'utilisation de .merge() et .toArray() émettra un seul élément lorsque toutes les séquences observables seront terminées. Si l'un des observables continue à émettre, il ne sera pas émis ou complet.

L'utilisation de .combineLatest() renverra un Observable qui émet la liste complète à chaque changement observable:

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