@archduke

Как с помощью rxjava2 совместить несколько связанных запросов в наборе данных?

Привет.
Как можно с помощью rxjava2 осуществить такую последовательность действий?:
Есть приблизительно такая структура:
class Holder {
  List<Image> images;
}
class Image {
  String url;
  String localFileUrl;
}

Нужно:
* Пройти по списку Holder'ов;
  * Для каждого Holder'а пройти по Image'ам;
    * Декодировать bitmap из Image.localFileUrl и зааплоадить bitmap на сервер и получить url, 
      записать его в Image.url; 
* После того как обошли все Holder и для каждого Image внутри зааплоадили картинку и получили url, 
  зааплоадить список Holder'ов;

Пробовал делать как то так:
Observable.fromIterable(holders)
      .concatMap(holder -> {
        Observable.fromIterable(holder.images)
          .concatMap(image -> {
            // decode bitmap here
            uploadImage(bitmap)
          })
      })
    // what should I do here to get observable which emits holders,
    // not result from uploadImage(bitmap)?
      .toList()
      .flatMap(? -> uploadeHolders());

Уже не имею идей возиожно ли подобного добиться с rxjava? Подходящего оператора не нашел для подобного, тут видимо нужен какой то специальный подход, но не могу сообразить как надо? Помогите пожалуйста.
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Observable.fromIterable(holders) //Observable<Holder>
    .concatMap(holder -> Observable.fromIterable(holder.images) //Observable<Image>
        .concatMap(image -> uploadImage(image)) //Observable<Image>
        .toList() //Observable<List<Image>>
        .map(images -> holder)) //Observable<Holder>
    .toList() //Observable<List<Holder>>
    .switchMap(holders -> uploadHolders(holders))
    .subscribe();

Обрати внимание, что в Rx строго рекомендуется иметь иммутабельные данные. То есть поля в твоих классах должны быть final, иначе ты очень сильно огребешь на конкурентности. Если пишешь на джаве, лучше использовать AutoValue для классов с данными.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ЭЛКОМ+ Санкт-Петербург
от 80 000 до 110 000 руб.
АКМЭ сервис Санкт-Петербург
от 80 000 до 110 000 руб.
iGooods.ru Санкт-Петербург
от 150 000 руб.