2015-09-25 68 views
3

好吧,所以我在一个项目上工作,我需要从服务器获取Json,获取相应的POJO,填充一些视图并结束。RxJava缓存网络调用

我面临的问题是,我必须嵌套网络调用来获得我需要的最终数据。为了最大限度地减少网络调用,我必须重用它们,并且这会导致非常复杂的RxOperator链。例如:

getCarId() // network call 
    .flatMap(carIdObj -> getCarModelById(carIdObj) 
          .doOnNext(... update car views) 
          .flatMap(carModelObj -> { return carIdObj;}  
    .flatMap(carIdObj --> getTruckModelById(carIdObj) 
          .doOnNext(... update truck views) 
          .flatMamp(truckModelObj -> { return carIdObj; } 

解释操作链(这是一个例子)

  • 得到所有汽车的ID(网络CALL1)
  • 每节车厢号,找到真正的汽车
  • GET汽车模型从汽车id(网络call2)
  • 汽车模型更新视图
  • 获取所有汽车ID(网络call3)
  • 每节车厢号,找到卡车从车ID
  • GET卡车模型(网络call4)与卡车模型
  • 更新视图

因此,网络CALL1和网络呼叫3是相同的,所以我应该重用它们,这意味着,我应该只调用一次并保存数据。这就是为什么上面的Rx运算符链。

我的问题是,有没有什么办法达到同样的效果,但是通过缓存网络call1而不是这个可怕的不可读的运营商链?

我不明白高速缓存如何工作,我该如何将此操作符应用于此场景?

回答

3

cache正是你所需要的,这里是你如何使用它:

cachedCarIds = getCarIds().cache(); 

cachedCarIds.map(this::getCarModelById).subscribe(... update car views); 
cachedCarIds.map(this::getTruckModelById).subscribe(... update truck views); 

cache()将确保完成一次预订ID(在第一次订阅),以及它的所有值都保存以备用户。

+0

快速的问题,如果这条线:在第一行之后被称为几秒/分钟 – clu