2015-09-25 69 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