Tsudzukeru
@Tsudzukeru

Как сделать из двух Rx запросов один, используя flatMap?

У меня есть следующий data класс:
data class MediaDetail(
   val dateCreated:String,
   val nasaId:String,
   val keywords:List<String>,
   val mediaType:String,
   val center:String,
   val title:String,
   val description:String,
   val location:String,
   var assets:Map<String,String>?
)


Мне приходится его инициализировать дважды. Первым методом fetchMediaDetails() все val поля и null для var поля assets. И уже с помощью второго метода fetchMediaAsset() инициализирую поле assets.

В результате у меня получается вот такой Rx запрос. Можно ли его сделать в один метод, с использованием flatMap? Если да, то как?

fun fetchMediaDetails(nasaId:String){
        _networkState.postValue(NetworkState.LOADING)

        try {
            compositeDisposable.add(
            apiService.mediaInfo(nasaId)
                .observeOn(Schedulers.io())
                .subscribeOn(Schedulers.io())
                .subscribe ({
                fetchMediaAsset(it.item)
                },{
                    _networkState.postValue(NetworkState.ERROR)
                    Log.e("MediaDetailsDataSource", it.message.toString())
                })
            )
        }
        catch (e: Exception){
            Log.e("MediaDetailsDataSource", e.message.toString())
        }
    }

    private fun fetchMediaAsset(mediaDetail: MediaDetail){
        try {
            compositeDisposable.add(
                apiService.mediaAsset(mediaDetail.nasaId)
                    .observeOn(Schedulers.io())
                    .subscribeOn(Schedulers.io())
                    .subscribe({
                        mediaDetail.assets = it.item
                        _downloadedMediaDetailsResponse.postValue(mediaDetail)
                        _networkState.postValue(NetworkState.LOADED)
                    }, {
                        Log.e("MediaDetailsDataSource", it.message.toString())
                    })
            )
        }
        catch (e: Exception){
            Log.e("MediaDetailsDataSource", e.message.toString())
        }
    }
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Так и сделать.
request1.flatMap{ mediaDetail ->
   request2(mediaDetail.id).map{
       mediaDetail.copy(assets=it.item)
   }
}. subscribe


Не надо в потоке иметь мутабельные данные, используй иммутабельные и копируй.
И уже в который раз тебе говорю, не надо смешивать rx и мутабельный Стейт.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы