MVVM Android MediatorLiveData Вложенные вызовы - PullRequest
1 голос
/ 05 апреля 2019

У меня есть список идентификаторов домов, которые мне нужно получить. Я получаю каждый дом, делая вызов API, чтобы получить его. Затем для каждого дома мне нужно сделать еще один вызов API, чтобы узнать его местоположение. Таким образом, представление будет иметь список домов, и мне нужно отобразить название дома (исходя из первого вызова API) и местоположение дома (исходя из второго вызова API).

Я ищу правильный способ реализовать это в архитектуре MVVM. Чтобы получить список домов, я использую MediatorLiveData, как показано ниже:

fun loadHouses(ids: List<Int>): LiveData<Resource<MutableList<House>>> {

        val liveDataMerger =  MediatorLiveData<Resource<MutableList<House>>>()

        ids.forEach { id ->
            liveDataMerger.addSource(loadHouse(id)) {
                if(it.data !=null) {
                    liveDataMerger.value?.data?.add(it.data)
                    liveDataMerger.postValue(liveDataMerger.value)
                }
            }
        }
        return liveDataMerger
    }

И загрузить один дом:

fun loadHouse(id: String): LiveData<Resource<House>> {
    return object : NetworkBoundResource<House, House>() {
        override fun saveCallResult(item: House) {
            db.runInTransaction {
                dao.insertHouse(house = item)
            }
        }

        override fun shouldFetch(data: House?): Boolean {
            return data == null
        }

        override fun loadFromDb() = dao.loadHouse(id)

        override fun createCall() = starWarsService.getHouse(id)

    }.asLiveData()
}

Так, каков наилучший способ загрузить местоположение каждого дома и обновить вид дома, чтобы отобразить местоположение?

Спасибо!

...