2015-09-25 2 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; } 

Разъяснение цепей оператора (это пример)

  • получить все машины IdS (сеть call1)
  • для каждого автомобиля ид, найти реальные автомобили
  • прибудете модель автомобиля с идентификатора автомобиля (номер телефона2)
  • обновленный вид с автомобилем модель
  • получить все идентификаторы автомобиля (сетевой вызов3)
  • для каждого автомобиля ид, найти грузовики
  • ПОЛУЧИТЬ грузовик модель из автомобиля ид (сеть call4) вид
  • обновление с моделью грузовика

Таким образом, сеть call1 и вызовов сети 3 являются одинаковыми, так я должен их повторно использовать, а это значит, я должен просто вызвать его один раз и сохранить данные. Вот почему цепи Rx-Operator выше.

Мой вопрос в том, есть ли способ сделать то же самое, но кешированием сетевого вызова1 вместо этой ужасной нечитаемой цепи оператора?

Я не понимаю, как работает кеш, как я могу применить этот оператор к этому сценарию?

ответ

3

cache именно то, что вам нужно, и вот как вы его используете:

cachedCarIds = getCarIds().cache(); 

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

cache() обеспечит идентификатор подписки сделано только один раз (при первой подписке), и все его значения будут сохранены для будущих абонентов.

+0

Быстрый вопрос, что если эта строка: называется несколько секунд/мин после первой строки – clu

Смежные вопросы