2016-02-04 7 views
18

Ich habe ein Array von Thing Objekte, die ich in ConvertedThing Objekte konvertieren möchte, mit einer asynchronen Funktion, die Observable<ConvertedThing> zurückgibt.Wie erstelle ich ein Observable eines Arrays aus einer Reihe von Observablen?

Ich möchte eine Observable<[ConvertedThing]> erstellen, die einen Wert ausgibt, wenn alle Konvertierungen abgeschlossen sind.

Wie kann dies erreicht werden? Jede Hilfe sehr geschätzt!

Antwort

21

Sie können .merge() verwenden, um das Array von Observablen zu einer einzigen Observablen zu kombinieren, und dann .toArray() verwenden, um sie als Liste in einem einzelnen Ereignis zu erhalten.

Für RxSwift 3+ Verwendung:

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

Bei früheren Versionen:

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

Mein Ausgangspunkt ist ein Array von Observablen, anstatt eine einzelne. Also möchte ich von "[Observable ]" zu "Observable <[ConvertedThing]>" kommen. – Paul

+0

@Paul: Entschuldigung. Aktualisiert. – kennytm

4

Für zukünftige Leser:

.merge() und .toArray() Verwendung wird ein einzelnes Element emittiert, wenn alle beobachtbaren Sequenzen vollständig . Wenn eines der Observables weiterhin emittiert, wird es weder emittieren noch vervollständigen.

.combineLatest() Verwendung wird eine Observable zurückkehren, dass jedes Mal alle beobachtbaren Veränderungen die vollständige Liste aussendet:

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