Rx concatWith()仅返回第一个Flowable结果

时间:2017-06-13 15:38:03

标签: android rx-java rx-java2

我已经发布了他们分别工作的所有方法,但是我遇到了第一个方面的问题,我在那里使用了两个flowables

=IF(A1<>B1,"Partial",IF(A1="","InComplete","Complete"))

更新方法:userStores()用于收藏夹和其他商店,

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

1 个答案:

答案 0 :(得分:1)

根据评论跟进和其他信息,您没有专门针对concat()的问题,我认为它是有效的,它不是您想要在这里实现的工具。

concat()不会将两个列表连接到一个列表,但是首先会先发送所有项目Flowable,然后只发出第二个Flowable发出的项目(因此你必须{ {1}}如此结束将知道onComplete何时结束,我在开始时提出的问题。

为了将列表组合在一起,我建议将两个商店Flowable(收藏夹/其他)压缩,然后简单地组合到列表以获得组合列表的单个输出。
除此之外,正如您所指出的那样,由于两个存储Obesrvable来自Observable,您将两次调用网络请求,这绝对不是必需的。您可以使用userStores()来解决它,它会将网络结果共享并多播到publish(),从而产生单个网络请求。

总结一下,我宁愿建议在这里使用Single,而不是Observable,因为你没有背压奉献。类似于以下实现:

Flowable