2017-02-07 4 views
2

Ich benutze ein Builder-Muster, um auf einem Modellobjekt aufzubauen, das Daten aus verschiedenen Netzwerkaufrufen kombiniert, und es fällt mir schwer zu verstehen, wie man das Modellobjekt am besten ausnimmt ersten Netzwerkanruf und kombinieren Sie die Daten des zweiten Netzwerkaufrufs mit dem ursprünglichen Modellobjekt.RxJava: Verkettung von Observablen mit Builder-Objekt

Mein eigentliches Abonnement:

myFirstApiRepository.getFirstModelObjectBuilder() 
    .flatmap(firstModelObjectBuilder -> mySecondApiRepository.getSomeExtraData(firstModelObjectBuilder)) 
    .observable.subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(getMySubscriber()); 

Erstes Netzanruf:

public Observable<FirstModelObject.Builder> getFirstModelObjectBuilder() { 
    return myFirstApiResource.getSomeData(...) 
      .flatMap(someData -> Observable.just(new FirstModelObject.Builder() 
       .setFirstAttribute(someData.getFirstAttribute()) 
       .setSecondAttribute(someData.getSecondAttribute()))); 
} 

Zweiter Netzanruf:

public Observable<FirstModelObject> getSomeExtraData(FirstModelObject.Builder builder) { 
    return mySecondApiResource.getSomeData(...) 
     .flatMap(aString -> builder.setSomeStringValue(aString) 
            .build()); 
} 

Das Problem hier ist, dass ich das Builder-Objekt übergeben habe in der zweite Netzwerkaufruf ist beobachtbar. Dies macht es sehr steif und ich möchte lieber nicht auf meinen verweisen und einen Datentyp referenzieren, auf den er nicht verweisen sollte. Es macht auch diese zweite Methode hier ".build()" das Objekt, das nicht gut ist. Also, wie kann ich die firstModelObject verwenden und Daten aus dem zweiten Netzwerkanruf in einer sauberen Weise hinzufügen?

Wenn dies nur schlechtes Design ist, lass es mich wissen. Ich versuche immer noch, mehr über die besten Praktiken von RxJava zu erfahren. :)

Antwort

1

Wenn Ihre zweite Anfrage auf das Ergebnis der ersten Anfrage angewiesen ist, dann überprüfen Sie meine Antwort - https://stackoverflow.com/a/41820372/7045114.

Wenn nicht - verwenden nur zip Betreiber:

Kombiniert die Emissionen mehrerer Observable zusammen über eine bestimmte Funktion und Einzelstücke für jede Kombination emittieren auf den Ergebnissen dieser Funktion basiert.

Observable.zip(firstRequest, secondRequest, (firstResult, secondResult) -> { 
    //process results 
}) 
+0

In meinem Beispiel die erste Anforderung gibt einen beobachtbaren eines Typs und die zweite Anforderung gibt einen beobachtbaren eines anderen Typs. Ich denke, Ihre verknüpfte Antwort funktioniert nur, wenn die beiden Datentypen identisch sind. Bitte korrigieren Sie mich, falls ich falsch liege. – w3bshark

+0

Es hängt nicht vom beobachtbaren Typ ab. FlatMap transformiert Observables unabhängig von ihrem Typ. –

+0

Schauen Sie sich die Deklarationen von Funktionen genau an - z. flatMap benötigt 'Func1 > '- erster Wert - Eingabetyp, zweiter - Ausgang. Beides kann völlig anders sein. –

Verwandte Themen