2016-09-23 5 views
3

Я использую RxJava + Retrofit.Retrofit + RxJava: как запросить несколько запросов по порядку и собрать результаты в одиночном наблюдении?

Например, есть статья

public class Article { 
    private Long articleId; 
    private Long userId; 
    private String image; 
    private String text; 
    ... 
} 

пользователя и

public class User { 
    private Long userId; 
    private String userName; 
    private String image; 
    ... 
} 

И есть два служб по

  • Observable<List<User>> getUserByUserIds(List<Long> userIds) и
  • Observable<List<Article>> listArticles(int pageIdx, int pageMax)

Я хочу перечислить 10 статей и связанных с ними авторских данных пользователя, собрать их в нечто вроде Observable<List<Pair<Article, User>>>, возможно ли это?

+0

Вы ищете [ZIP] (http://reactivex.io/documentation/operators/zip.html) оператор – EpicPandaForce

+0

Как уже упоминалось, использование zip-оператора. Пример https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ZipExampleActivity.java – Raghunandan

+0

'listArticles' и' getUserByUserIds' связаны , Я должен сделать первый звонок и получить идентификатор пользователя автора статьи, а затем сделать второй вызов, операция zip подходит для создания синхронных несвязанных запросов. – Kim

ответ

0

Одним из способов может быть использование оператора zip, который может объединять несколько Observables вместе. Вы можете прочитать больше here. Просто пройти два наблюдаема почтовый оператор

+0

Спасибо за ответ. Кажется, операция zip заключается в создании синхронных вызовов, это не соответствует моим требованиям. – Kim

+0

Тогда вы можете использовать оператор компоновки, предоставляющий настраиваемый трансформатор, который будет извлекать идентификаторы из первого вызова и возвращать его, чтобы второй вызов мог его использовать. – Blackbelt

2

Это должно сделать трюк:

listArticles(int pageIdx, int pageMax) 
.flatMapIterable(list->list) 
.flatMap(article -> 
    getUserByUserIds(article.userId) 
    .subscribeOn(Schedulers.io()) 
    .flatMapIterable(list->list), 
    Pair::of 
) 
.toList(); 

Однако API плохо specced; Наблюдатели уже имеют врожденный порядок, нет необходимости обертывать все в список. getUserByIds - вернет ли он одного пользователя или нескольких пользователей? Почему бы не использовать один id для метода User? Почему в примитивах объектов домена нет идентификаторов? Ожидаете ли вы иметь предметы без идентификаторов?

+0

Спасибо за ответ, 'getUsersByUserIds' возвращает список пользователи. Я хочу сделать один звонок для получения нескольких пользователей, чтобы сохранить трафик и нагрузку на сервер. Есть ли способ сделать только два вызова (один для получения статей, а другой для получения связанных пользователей)? – Kim

+0

Что касается атрибута ID в объекте домена, который не является примитивным, я просто скопировал их из Hibernate reverse engineeringings (да, с сервера), мне было все равно, я должен сделать некоторые исследования! – Kim

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