MVVM Android MediatorLiveData嵌套调用

时间:2019-04-04 22:41:14

标签: android mvvm kotlin android-livedata

我有一个需要获取的房屋ID列表。我通过执行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()
}

那么加载每个房屋的位置并更新房屋的视图以显示位置的最佳方法是什么?

谢谢!

0 个答案:

没有答案