Получение Observable> из Observable>
- >
Есть два метода:
fun getMovieActors(id: Long) =
provider.retrofit
.loadMovieCreditsById(id, WebProvider.API_KEY)
.subscribeOn(Schedulers.io())
.map { credits ->
credits.cast.map { it.id }
} // в конце получаем Observable<List<Long>> (списко id актеров)
@GET("movie/{movie_id}/credits")
fun loadMovieCreditsById(@Path("movie_id") id: Long, @Query("api_key") apiKey: String): Observable<Credits>
fun getActorByID(id: Long) =
provider.retrofit
.loadActor(id, WebProvider.API_KEY)
.subscribeOn(Schedulers.io())
.zipWith(getImageConfiguration().subscribeOn(Schedulers.io())) { actor, configuration ->
actor.also {
it.profile_path =
createImageUri( configuration.images.profile_sizes[3], it.profile_path )
}
} // в конце получаем Observable<Actor> (конкретный актер по его id)
@GET("person/{person_id}")
fun loadActor(@Path("person_id") id: Long, @Query( "api_key") apiKey: String): Observable<Actor>
Вопрос заключается в том, что я хочу иметь метод, который из List<Long> сделает List<Actor> , но не могу придумать реализацию данного метода.
Возвращаемое значение должно быть именно Observable<List<Actor>>. (из собсветнных попыток всегда получаю в лучшем случае Observable<Observable<List<Actor>>>, либо Disposable)
Заранее огромное спасибо
Ответы (2 шт):
Автор решения: Shams
→ Ссылка
provider.retrofit
.loadMovieCreditsById(id, WebProvider.API_KEY)
.subscribeOn(Schedulers.io())
.flatMap { credits ->
credits.cast.map { it.id }
}
.flatMapIterable { it }
.flatMap { getActorByID(it)}
.toList() // Вот здесь вы получите List<Actor>, если я все правильно понял. :)
Автор решения: IR42
→ Ссылка
getIds() // Observable<List<Long>>
.flatMapSingle { ids ->
val observables: List<Observable<Actor>> = ids.map { getActorByID(it) }
Observable.concat(observables).toList(observables.size)
} // Observable<List<Actor>>