#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)