Сопрограммы и лучшая практика ViewModel для разделения концертов

#android #kotlin #concurrency #kotlin-coroutines

Вопрос:

Мне нужно было какое-то направление, чтобы иметь возможность наблюдать некоторый поток в виде живых данных в моем классе ViewModel.

Например: Класс ViewModel имеет поле userDataFlow ниже, которое объединяет несколько потоков потока данных. Я хочу иметь возможность извлечь работу этого поля в отдельный класс и позволить всей внутренней работе происходить там, и просто хочу наблюдать за живыми данными в поле в модели представления. Мне нужно было бы передать несколько вещей в параметре этого класса из ViewModel, которые понадобятся потоку для работы. Не уверен, что это хорошая практика. В принципе, позвольте моей модели просмотра просмотреть результат и передать его в представление.

    val userDataFlow: Flow<List<UserData>> = 
   combine(
       familyChannel.asFlow(),
       userRealTimeData.asFlow,  
       ).asLiveData()
}
 

Комментарии:

1. Этот код не имеет смысла. Это поток или живые данные? Вы берете возвращенный поток combine и преобразуете его в LiveData только для того, чтобы попытаться инициализировать свойство потока с его помощью. Я не понимаю вашего описания того, что вы пытаетесь сделать.

2. Ваш вопрос не очень ясен.. Но, поскольку вы говорили о разделении проблем, я бы добавил слой репозитория для обработки бизнес-логики, а не для обработки модели представления. Пусть модель представления только подготовит данные для представления. Проверьте это: developer.android.com/jetpack/guide

Ответ №1:

Похоже, вам нужен UseCase / Interactor , который, короче говоря, обрабатывает данные, поступающие из разных репозиториев.

Например, предположим, что вам нужен список ваших друзей, живущих в странах с уровнем заражения COVID-19 выше определенного значения:

 class GetFriendsInDangerUseCase(
    private val friendsRepository: FriendsRepository,
    private val countryRepository: CountryRepository)

    fun invoke(threshold: Float) = friendsRepository.friendsFlow
        .combine(countryRepository.countriesFlow) { friends, countries ->
            val dangerousCountries = countries.filter { it.infectionRate >= threshold }
            friends.filter { it.country in dangerousCountries }
        }
 

Затем используйте его вот так с вашей виртуальной машины:

 val friendsInDangerFlow = getFriendsInDanger(0.5)