Как объединить несколько результатов, излучаемых наблюдаемыми, в один результат и выдать его один раз?
У меня есть услуга по модернизации:
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())
));
}
Это решение не включает проблемы со страницами. Вот почему это только частичное решение