2017-06-13 65 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() 
     ); 
相关问题