2016-05-17 3 views
0

ПРОБЛЕМАРаспространение наблюдаемым, а затем сгруппировать их вместе

Мне нужно создать операцию, как это:

get all elements from DB -> send call to API that these elements are marked as read -> save status of read elements

Я пытаюсь сделать хорошую цепочку с RxJava, и я хочу :

  1. Сбор данных из БД
  2. Создано Observ в состоянии с List<Integer> с remoteIds
  3. вызовов API на этих элементах
  4. Соберите все ответы и передать его в качестве List<Integer>
  5. Сохранить ответы

проблемой является распространение и группировка из точек 3. 4. Я не уверен, как сделать такую ​​цепочку. И, как вы можете видеть ниже, я застрял в пункте 3. с моим кодом, потому что я не знаю, как собрать данные для каждого запроса. Есть ли какая-то трансформация, которая может быть полезной в моем случае?

АКТУАЛЬНО ПРОГРЕСС ака КОД

sub = getDb() 
      .createQuery(DbContract.Notification.TABLE_NAME, sql, String.valueOf(NOTIFICATION_UNREAD)) 
      .map(new CursorListMapper<>(new NotificationPersistenceModel())) 
      .map(new Func1<List<DataNotification>, Observable<List<Integer>>>() { 
       @Override 
       public Observable<List<Integer>> call(List<DataNotification> notifications) { 
        List<Integer> ids = new ArrayList<>(); 
        for (DataNotification notification : notifications) { 
         ids.add(notification.getRemoteId()); 
        } 

        return Observable.just(ids); 
       } 
      }) 
      .subscribe(); 

EDIT

  • Список Observables казалось плохой идеей - изменить на Observable<List<Integer>>

ответ

1

Вместо отображения на Observable<List<Integer>>, карта - List<Integer>, а затем используйте Observable.from(), чтобы преобразовать список в Наблюдаемый, испускающий каждый элемент списка. Затем вы просто установите карту, чтобы позвонить в Api. Вот пример

getDb() 
     .createQuery(...) 
     .map(...) 
     .map(...) // map to List<Integer> 
     .flatMap(new Func1<List<Integer>, Observable<List<Response>>>() { 
      @Override 
      public Observable<List<Response>> call(List<Integer> integers) { 
       return Observable.from(list) 
         .flatMap(new Func1<Integer, Observable<Response>>() { 
          @Override 
          public Observable<Response> call(Integer integer) { 
           return api.call(integer); 
          } 
         }) 
         .toList(); 
      } 
     }) 

, чем вы можете продолжить отображение/flatMapping все, что вы хотите достичь

+0

Спасибо родственного, который был недостающая частью! Не знал о методе toList, что очень помогло. – JakubW

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