Каскадные потоки через MediatorLiveData - PullRequest
0 голосов
/ 13 октября 2019

Моя задача проста.

У меня есть тип результата NeighbourhoodView (POKO), который будет создан тремя ливатами (которые являются таблицами комнат

LiveData<Neighbourhood>
LiveData<City>
LiveData<Country>

). Цель состоит в том, чтобы взять эти три таблицы комнат и преобразовать их вPOKO, которое будет отображаться в моем фрагменте

Я читал в местах, где MediatorLiveData позволяет объединять источники, однако из всего, что я прочитал, источники потока автономны.

У меня есть зависимые источники

Мой первый источник - это район, который будет выбран по идентификатору. Мой второй источник зависит от возвращаемого района, который будет возвращать город. Моим третьим источником будет страна, которая зависит отгород возвращен

    operator fun invoke(neighbourhoodId: Long) {
    val result = MediatorLiveData<NeighbourhoodView>()

    val source1 = systemRepository.neighbourhoodById(neighbourhoodId)

source1.value здесь имеет значение null

    val source2 = systemRepository.cityById(source1.value?.cityId!!)
    val source3 = systemRepository.countryById(source2.value?.countryId!!)

    result.addSource(source1) {
        result.value = combineLatestData(source1, source2, source3)
    }
    result.addSource(source2) {
        result.value = combineLatestData(source1, source2, source3)
    }
    result.addSource(source3) {
        result.value = combineLatestData(source1, source2, source3)
    }
}

private fun combineLatestData(
    neighbourhood: LiveData<Neighbourhood>,
    city: LiveData<City>,
    country: LiveData<Country>
): NeighbourhoodView {


    return NeighbourhoodView(
        id = neighbourhood.value!!.id, name = neighbourhood.value!!.name, city = CityView(
            id = city.value!!.id,
            name = city.value!!.name,
            countryView = CountryView(id = country.value!!.id, name = country.value!!.name)
        )
    )
}

Что мне здесь не хватает? Чего я пытаюсь достичь, даже возможно?

...