Заполненная модель с дополнительным ответом с использованием Rx

Я новичок в Rx java, и моя текущая задача: у меня есть 2 запроса.

@GET(NEWS_LIST)
fun getNews(): Observable<NewsResponse>

@GET
fun getNewsImage(@Url url: String): Observable<NewsImage>

и я хотел бы добавить URL-адрес изображения в 1-ю модель ответа из 2-й. 2-й зависит от 1-го. Как их можно объединить в потоке Rx?

Итак, 1-й запрос возвращает мне список новостей, затем мне нужно вызвать getNewsImage(url) для каждого элемента с URL-адресом из этой модели, проанализировать URL-адрес реального изображения из второго ответа, добавить его в объект news и получить окончательный список с заполненными моделями Спасибо за любой совет


person Gorets    schedule 11.11.2016    source источник
comment
flatMap поможет вам.   -  person Tassos Bassoukos    schedule 12.11.2016


Ответы (2)


getNews()
        .flatMap { Observable.fromIterable(it.getTopicsList()) } //or Observable.from() if you use RxJava1
        .flatMap({ getNewsImage(it) }, { topic, imageUrl ->
            topic.imageUrl = imageUrl
            return@flatMap topic
        })
        .toList()

Второй flatMap объединяет элементы из исходного Observable с Observable, вызванным этими исходными элементами, и испускает эти комбинации. Дополнительная информация

person Maksim Ostrovidov    schedule 12.11.2016
comment
Спасибо, 2nd flatMap сводит меня с ума, надеюсь привыкну к функциональному программированию - person Gorets; 12.11.2016

если я правильно понял: 1-й ответ List<> или какой-то Collection. Итак, вы можете сделать так:

getNews().from()
    .flatmap(new Func1<1stResponseItem, 2dnResponseItem>() {
        @Override
        public 2dnResponseItem call(1stResponseItem response) {
            return getNewsImage(response.getImageUrl());
        }
    })
    .tolist()

P.S. Документы о .from() , о toList()

person borichellow    schedule 12.11.2016