В моем приложении у меня есть две службы, и у каждой из них есть метод, который делает запросы, а затем возвращает Observable другого типа.
Я хочу отобразить в RecyclerView список, составленный из результата объединения этих двух наблюдаемых.Я гуглил об этом и нашел метод zip (), который, кажется, делает именно то, что я хочу.Я пытаюсь реализовать это, но я не знаю, как это сделать правильно.
Пока я гуглил, я придумал эту эту статью , которая, кажется, объясняет это ясно.Хотя автор использует Singles, а я использую Observables.
Насколько я понимаю, как работает zip()
, я знаю, что должен передать каждое Observable, которое я хочу, "сжать", а затем я должен указать функцию, которая будет составлять мой последний Observable, верно?
Это мой код:
interface InvitationService {
@GET("foo/{userId}")
fun getFooByUser(@Path("userId") userId: String): Observable<Response<ArrayList<Foo>>>
}
interface InvitationService {
@GET("bar/{userId}")
fun getBarByUser(@Path("userId") userId: String): Observable<Response<ArrayList<Bar>>>
}
class FooRemoteDataSource : FooDataSource {
private var apiService: FooService
fun getFooByUser(userId:String) {
return apiService.getFooByUser(userId)
}
}
class BarRemoteDataSource : BarDataSource {
private var apiService: BarService
fun getBarByUser(userId:String) {
return apiService.getBarByUser(userId)
}
}
class FooRepository(private val remoteDataSource: InvitationRemoteDataSource) : FooDataSource {
override fun getFooByUser(userId: String): Observable<Response<ArrayList<Foo>>> {
return remoteDataSource.getFooByUser(userId)
}
}
class BarRepository(private val remoteDataSource: BarRemoteDataSource) : BarDataSource {
override fun getBarByUser(userId: String): Observable<Response<ArrayList<Bar>>> {
return remoteDataSource.getBarByUser(userId)
}
}
И вот где я на самом деле застрял:
class ListPresenter(var listFragment: ListContract.View?,
val fooRepository: FooRepository,
val barRepository: BarRepository) : ListContract.Presenter {
fun start() {
loadList()
}
private fun loadLists() {
//HERE IS WHERE IM STUCK
Observable.zip(fooRepository.getFooByUser(userId).subscribeOn(Schedulers.io()),
barRepository.getBarByUser(userId).subscribeOn(Schedulers.io()),
)
// AFTER 'ZIPPING' THE OBSERVABLES
// I NEED TO UPDATE THE VIEW ACCORDINGLY
}
}
Я не знаю, как правильно вызвать zip()
Я знаю, что должен передать функцию, но не получаю ее, потому что в статье, указанной выше, автор использует Function3
, потому что у него есть 3 Observables.
Поскольку у меня только 2, я не знаю, как это сделать.Если открывать фигурные скобки после запятой внутри аргумента метода, требуется, чтобы я возвратил BiFunction<ArrayList<Foo>, ArrayList<Bar>>
, что я не знаю, как указать.
Кто-нибудь объяснит мне это?