Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Как выполнить более 3 параллельных http запросов с помощью RxJava (+retrofit2) в Android

Пытаюсь освоить работу с RxJava + retrofit2 + kotlin.
Как в этом участвует Observable в общем разобрался, даже научился объединять результаты 2-3 параллельных запросов по итогу выполнения всех с помощью Observable.zip, НО как похожим образом выполнить более 3 параллельных запросов не могу понять.
В исходном коде класса Observable есть метод
static Observable zip(),
но он не работает как
static Observable zip()
в случае с тремя Observable на вход и Function3<*,*,*,*>.
Старался уже сделать первые три запроса с помощью zip, потом flatMap и тд, но всё не выходит. Чтение документации и примеров не помогают повернуть к нужному направлению. Смотрел в сторону Observable.combineLatest, но пришел к выводу (может ошибочному), что метод вернет результат первого выполнившегося Observable.
Если в целом, что я хочу:
У меня есть 4 метода, которые возвращают Observable:
this.orderRepository.getStatuses():Observable this.orderRepository.getOrders():Observable this.userRepository.getUsers():Observable this.orderRepository.getTypes():Observable
Подскажите, пожалуйста, как я должен скомпоновать эти методы, чтобы они выполнились параллельно, и в конце получить результат выполнения всех 4 методов в одном месте?
Мои стыдливые попытки ниже. Это уже что-то испорченное, но я вообще не понимаю, что я должен сделать с 4 Observables, чтобы их всех в одном месте и вернуть в UI. + уже запутался с flatMap, map и так далее...
override fun buildUseCaseObservable(params: Params): Observable {
return Observable.zip( this.userRepository.getUsers(100, 1, ApiUserFilter(isManager = true)), this.orderRepository.getOrderStatuses(), this.orderRepository.getOrderTypes(), Function3 { t1, t2, t3 -> Zip(t1,t2,t3) }).map { this.orderRepository.getOrders(params.limit, params.page, params.filter).flatMap { it } }
}


Ответ

Zip для четырех observable можно написать так:
Observable.zip( getStatuses(), getOrders(), getUsers(), getTypes(), Function4 { status, order, user, type -> ... } )

Комментариев нет:

Отправить комментарий