viewModelScope.launch {
interactor.listenForUpdates().collect()
}
fun listenForUpdates(): Flow<Int> {
return repository.oneChannel.asFlow()
.combine(twoChannel.asFlow()) { i,_ -> i}
.map { updateUi(it) }
}
Если функция только связывает потоки данных, ей не надо быть suspend. И как минимум ей не надо быть suspend, если компилятор не требует.
если продолжать аналогии с тасканием ящиков то получается что для выполнения работы надо 1) создать план действий, т.е. грубо говоря, кто, откуда, куда, сколько и как часто будет носить, это и есть создание Flow. Сама по себе операция вроде не тяжёлая, делать это через suspend большого смысла вроде нет. 2) непосредственная переноска тяжестей, с некоторыми преобразованиями, типа, перепаковать c одних ящиков в другие (map) и прочее. Тут необходимо понимать, что количество работников ограниченное, и на кассе ещё и людям отвечать надо что то. Поэтому всё делается через suspend внутри корутин скоупа. Грузчик как бы несёт ящик, но если надо отвлечся - отвечает людям на кассе, время от времени перекуривает, а затем продолжает выполнять перемещение тяжестей. Это наш .collect {} который запускает процесс подготовленный в первом пункте. Т.е. если мы добавим suspend к функции что возвращает флоу мы просто сделаем неблокирующей функцию, которая создает сам флоу, сам план действий, что само по себе не должно занимать много процессорного времени. Поправьте меня, пожалуйста, если где то ошибся.
Обсуждают сегодня