2017-06-13 68 views
0

我已經發布,他們分別工作的所有方法,但我面對的問題與第一個,在那裏我concatWith()兩大懸浮劑的Rx concatWith()只返回第一可流動的結果

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; 
    });} 

更新方法:userStores( )用於喜愛和其他商店,

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

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

'userStores()'方法做了什麼?確保'Flowable'觸發'onComplete',否則'concat'將不起作用 – yosriz

+0

你期望發生什麼我想知道? –

+0

@Habib Okanla他們每個人發出3個項目,在一個可流動的項目中有6個項目 –

回答

1

繼評論跟進,以及其他信息,你不會有問題專門與concat(),我假設它是工作,它只是不你想在這裏實現的工具。

concat()不會連接兩個列表到一個列表,但過早地將首先發出的所有項目由發出第一Flowable才把項目第二Flowable(因此你必須有onComplete所以CONCAT會知道什麼時候Flowable是結束,我在開始時問)。

爲了將列表結合在一起,我建議將兩個商店Obesrvable s(收藏夾/其他)壓縮,然後簡單地組合列表以具有單個輸出的組合列表。
除此之外,正如您所指出的那樣,因爲兩個商店Observable都來自userStores(),您將兩次調用網絡請求,這絕對不是必需的。你可以使用publish()來解決它,它將共享和多播網絡結果給Observables,從而產生單個網絡請求。

總結起來,我寧願建議在這裏使用Single,而不是Flowable,因爲你沒有背壓傳道。類似於以下實現:

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