У меня есть три объекта (скажем, A, B, C), и для получения CI нужен B, а для получения A мне нужен B. На экране мне нужно отобразить свойство A вместе со свойством C. Даже еслиЯ могу получить все необходимые данные, так как я использую flatMap, у которого нет onComplete, toList () не выполняется.Вот мой код.
Для каждого a в List мне нужно получить c, и мне нужно вернуть список типа ResultMode, который включает в себя свойства a и c.
override fun methodICall(): LiveData<MutableList<ResultModel>> {
return mySdk
.getAllA() //Returns Flowable<List<A>>
.flatMap { Flowable.fromIterable(it) }
.flatMap { helperMethod(it) }
.toList() // Does not get executed as flatMap isnt completed
.toFlowable()
.onErrorReturn { Collections.emptyList() }
.subscribeOn(Schedulers.io())
.to { LiveDataReactiveStreams.fromPublisher(it) }
}
private fun helperMethod(a:A): Flowable<ResultModel> {
return mySdk
.getB(a.propertyOne!!) // Returns Single<B>
.flatMap { mySdk.getC(it.property!!) } // get C returns Single<C>
.map {
ResultModel(name= a.name,
date = c.date.toString(),
message = it.messageId!!
)
}.toFlowable()
}
Примечание. Я задавал похожий вопрос ранее сегодня, но для этого не требовалось использовать flatmap более одного раза.Вы можете просмотреть мое решение по этой ссылке
RxJava - Отображение результата списка в другой список
Мои усилия (что, вероятно, неправильно) Вот мои усилияпреобразования первого метода (для второго метода я просто удаляю в Flowable и возвращаю single), но ему предстоит долгий путь, и я думаю, что я на неправильном пути.
override fun methodICall(): LiveData<MutableList<ResultModel>> {
return mySdk
.getAllA()
.concatMapSingle { Flowable.fromIterable(it)
.map { helperMethod(it) }
.toList()
}
.onErrorReturn { Collections.emptyList() }
.subscribeOn(Schedulers.io())
.to { LiveDataReactiveStreams.fromPublisher(it) // here it is single. I think it is because two maps are applied both to helperMethod itself and inside helper method to result model}
}