2017-06-13 2 views
0

ich alle Methoden gebucht haben sie getrennt arbeiten, aber ich Gesicht Probleme mit dem ersten, wo ich concatWith() zwei fließfähigeRx concatWith() geben nur das erste fließfähige Ergebnis

return userFavouriteStores() 
    .concatWith(userOtherStores()) 
    .doOnNext(new Consumer<List<StoreModel>>() { 
     @Override 
     public void accept(@io.reactivex.annotations.NonNull List<StoreModel> storeModels) throws Exception { 
     Log.i("storeModels", "" + storeModels); 
     } 
    }) 


public Flowable<List<StoreModel>> userFavouriteStores() { 
return userStores() 
    .map(UserStores::favoriteStores) 
    .flatMap(storeId -> storeDao.storesWithIds(storeId)) 
    .map(stores -> { // TODO Konvert to Kotlin map {} 
     List<StoreModel> result = new ArrayList<>(stores.size()); 
     for (se.ica.handla.repositories.local.Store store : stores) { 
     result.add(store.toStoreModel(StoreModel.Source.Favourite)); 
     } 
     return result; 
    }); } 

public Flowable<List<StoreModel>> userOtherStores() { 
return userStores().map(UserStores::otherStores) 
    .flatMap(storeId -> storeDao.storesWithIds(storeId)) 
    .map(stores -> { 
     List<StoreModel> result = new ArrayList<>(stores.size()); 
     for (Store store : stores) { 
     result.add(store.toStoreModel(StoreModel.Source.Other)); 
     } 
     return result; 
    });} 

aktualisiert Methode: userStores () ist für die Favoriten und andere Geschäfte verwendet,

private Flowable<UserStores> userStores() { 
return apiIcaSeResource 
    .userStores() 
    .toFlowable(); } 

    @GET("user/stores") 
Single<UserStores> userStores(); 
+2

was macht die 'userStores()' Methode? vergewissere dich, dass 'Flowable'' onComplete' feuert, sonst 'concat' funktioniert nicht – yosriz

+0

Was erwartest du zu passieren? –

+0

@Habib Okanla jeder von ihnen emittiert 3 Artikel, um 6 Artikel in einem fließenden –

Antwort

1

nach den Kommentaren folgen, und weitere Informationen, die Sie haben kein Problem speziell mit den concat(), ich gehe davon aus ist es Arbeit, es ist nur nicht die Werkzeug für das, was Sie hier erreichen wollen.

concat() werden zwei Listen zu einer einzigen Liste nicht verketten, aber rathe werden zuerst alle Artikel von zweiten Flowable emittiert von ersten Flowable und nur dann Elemente emittieren (daher müssen Sie onComplete haben so concat wissen, wann Flowable Ende ist, was ich fragte am Anfang).

um die Listen zusammen zu kombinieren, würde ich vorschlagen, beide Geschäfte Obesrvable s (Favoriten/andere) zu zippen, und dann einfach zu kombinieren, um einzelne Ausgabe der kombinierten Liste zu haben.
Außerdem, wie Sie darauf hingewiesen, wie beide speichert Observable s kommt von userStores(), werden Sie die Netzwerkanforderung zweimal aufrufen, die definitiv nicht notwendig. Sie können es unter Verwendung publish() lösen, die das Netzwerkergebnis zu Observable s teilen und multicast, resultierend mit einzelner Netzanforderung.

um es zusammenzufassen, ich würde eher empfehlen, Single hier zu verwenden, nicht Flowable, da Sie keine Gegendruck-Weihen haben. etwas wie die folgende Implementierung:

Observable<List<StoreModel>> publish = userStores() 
     .toObservable() 
     .publish(userStores -> 
       Single.zip(
        userFavouriteStores(userStores.singleOrError()), 
        userOtherStores(userStores.singleOrError()), 
        (favoriteStores, otherStores) -> { 
         favoriteStores.addAll(otherStores); 
         return favoriteStores; 
        } 
       ) 
        .toObservable() 
     );