RxJava2 объединяет несколько наблюдаемых, чтобы они возвращали один результат - PullRequest
0 голосов
/ 29 апреля 2018

Как объединить несколько результатов, излучаемых наблюдаемыми, в один результат и выдать его один раз?

У меня есть услуга по модернизации:

public interface MyService {

    @GET("url")
    Observable<UserPostsResult> getUserPosts(@Query("userId") int id);

    @GET("url")
    Observable<UserPostsResult> getUserPosts(@Query("userId") int id, @Query("page") int pageId);
}

А у меня есть модель:

public class UserPostsResult {

   @SerializedName("posts")
   List<UserPost> mPosts;

   @SerializedName("nextPage")
   int mPageId;
}

Также у меня есть идентификаторы List<Integer> friendsIds;

Моя цель - создать такой метод:

public Observable<Feed> /*or Single<Feed>*/ getFeed(List<Integer> ids) {
    ...
}

Возвращает один Observable или Single, который выполняет следующее:

  • Объединяет все getUserPosts(idFromList) в одну наблюдаемую
  • Для каждого UserPostsResult необходимо сделать:

    if (userPostResult.mPageId > -1) getUserPosts(currentUserId, userPostResult.mPageId);

    И объединить этот результат с предыдущим userPostResult

  • Возвращает одну модель как результат всех операций.

Класс результата:

public class Feed {
    List<UserPost> mAllPostsForEachUser;
}

РЕДАКТИРОВАТЬ (Подробнее):

Мои спецификации клиента заключались в том, что я должен получать сообщения от пользователей социальной сети без входа в систему и без запроса токена. Поэтому я должен разобрать HTML-страницы. Вот почему у меня такая сложная структура.

РЕДАКТИРОВАТЬ (Частичное решение)

public Single<List<Post>> getFeed(List<User> users) {
    return Observable.fromIterable(users)
            .flatMap(user-> mService.getUserPosts(user.getId())
                    .flatMap(Observable::fromIterable))
            .toList()
            .doOnSuccess(list -> Collections.sort(list, (o1, o2) ->
                    Long.compare(o1.getTimestamp(), o2.getTimestamp())
            ));
}

Это решение не включает проблемы со страницами. Вот почему это только частичное решение

1 Ответ

0 голосов
/ 29 апреля 2018

Есть ряд операторов, которые превращают вещи в другие вещи. fromIterable() будет излучать каждый элемент в итерируемом, а flatMap() преобразует один тип наблюдаемой в другой тип наблюдаемой и испускает эти результаты.

Observable.fromIterable( friendsIds )
  .flatMap( id -> getUserPosts( id ) )
  .flatMap( userPostResult -> userPostResult.mPageId 
            ? getUserPosts(currentUserId, userPostResult.mPageId)
            : Observable.empty() )
  .toList()
  .subscribe( posts -> mAllPostsForEachUser = posts);
...