Объединить результат трех API в RxKotlin

У меня есть функция в репозитории, которая вызывает три API, которые возвращают три разных типа объектов.

fun scanSource(code: String) =
    firstApi.DataV11Get(code)
        .flatMap {
            firstApi.sccGet(it.sscc)
        }
        .flatMap {
            lastApi.lsccGet(it.id)
        }

в настоящее время он возвращает только результат последнего API в ViewModel. Теперь я хочу получить результат всего этого в модели представления.

плюс API должен быть последовательным, поскольку они используют данные из последнего API.

Также каждый API возвращает другой тип объекта. И мне нужны все три объекта после завершения всех трех вызовов.

Спасибо


person Syeda Zunaira    schedule 12.03.2020    source источник


Ответы (1)


Объявите эту функцию в своем репозитории API.

   fun getJobs(contractor_id: String): Observable<JobListModel> {
    return Observable.zip(
        apiInterface.pendingJobs(contractor_id, 0, 5),
        apiInterface.activeJobs(contractor_id, 0, 5),
        apiInterface.completedJobs(contractor_id, 0, 5),
        apiInterface.cancelledJobs(contractor_id, 0, 5),
        Function4<PendingJobResponseModel, ActiveJobResponseModel, CompletedJobResponseModel, CancelledJobResponseModel, JobListModel> { p, a, c, ca ->
            JobListModel(p, a, c, ca)
        }
    )
}

Это способ сделать zip для нескольких запросов и моделей.

Перейдите по этой ссылке для более подробного объяснения Rxjava Android, как использовать оператор Zip

Класс Job ListModel, который отображает все ответы

class JobListModel(
val pendingJobResponseModel: PendingJobResponseModel,
val activeJobResponseModel: ActiveJobResponseModel,
val completedJobResponseModel: CompletedJobResponseModel,
val cancelledJobResponseModel: CancelledJobResponseModel) : Serializable
person Afzal Khan    schedule 12.03.2020
comment
что такое JobListModel? - person Syeda Zunaira; 12.03.2020
comment
По сути, это конструктор класса модели, который принимает все 4 ответа. - person Afzal Khan; 12.03.2020
comment
О, вы имели в виду пользовательский класс? Ницца - person Syeda Zunaira; 12.03.2020
comment
Но что, если API activeJobs() требуется значение из объекта, возвращаемого из pendingJobs()? - person Syeda Zunaira; 12.03.2020
comment
Таким образом, вы можете сначала вызвать этот API, взять значение и сделать zip остальных двух - person Afzal Khan; 12.03.2020
comment
Давайте продолжим обсуждение в чате. - person Syeda Zunaira; 12.03.2020