У меня есть проблема, и я не знаю, как решить ее с лучшим подходом. Проблема в том, что я запрашиваю Spotify Web API, и в некоторых методах возвращается изображение исполнителя, а в других - только базовая c информация об исполнителе.
У меня есть два метода:
fun getAlbum(albumId: String): Single<SpotifyAlbumDTO>
fun getArtist(artistId: String): Single<SpotifyArtistDTO>
Когда я получаю альбом, информация об исполнителе не содержит URL-адрес изображения исполнителя. Итак, мне нужно вызвать метод getAlbum () и использовать результат для получения artistId, а затем вызвать метод getArtist ().
У меня есть следующий метод, чтобы сделать все это:
fun getAlbum(albumId: String): Single<Album>
В этом методе мне нужно вызвать два предыдущих, чтобы вернуть объект Album (мой объект домена). Единственное решение, которое сработало для меня, это следующее:
fun getAlbum(albumId: String): Single<Album> {
return Single.create { emitter ->
_spotifyService.getAlbum(albumId).subscribe { spotifyAlbum ->
_spotifyService.getArtist(spotifyAlbum.artist.id).subscribe { spotifyArtist ->
val artistImage = spotifyArtist.imageUrl
spotifyAlbum.artist.image = artistImage
emitter.onNext(spotifyAlbum.toAlbum())
}
}
}
}
Я думаю, что должен существовать другой лучший способ сделать это, чем объединение вызовов подписки в других подписках и создание более глубоких вызовов. Я также пробую следующее:
_spotifyService.getAlbum(albumId).flatMap { spotifyAlbum ->
_spotifyService.getArtist(spotifyAlbum.artist.id)
}.flatMap { spotifyArtist ->
// Here I don't have the album and I can't to asign the image
}