169 похожих чатов

Вот такой пример, нужен ли здесь suspend?

viewModelScope.launch {
interactor.listenForUpdates().collect()
}

fun listenForUpdates(): Flow<Int> {
return repository.oneChannel.asFlow()
.combine(twoChannel.asFlow()) { i,_ -> i}
.map { updateUi(it) }
}

2 ответов

15 просмотров

Если функция только связывает потоки данных, ей не надо быть suspend. И как минимум ей не надо быть suspend, если компилятор не требует.

если продолжать аналогии с тасканием ящиков то получается что для выполнения работы надо 1) создать план действий, т.е. грубо говоря, кто, откуда, куда, сколько и как часто будет носить, это и есть создание Flow. Сама по себе операция вроде не тяжёлая, делать это через suspend большого смысла вроде нет. 2) непосредственная переноска тяжестей, с некоторыми преобразованиями, типа, перепаковать c одних ящиков в другие (map) и прочее. Тут необходимо понимать, что количество работников ограниченное, и на кассе ещё и людям отвечать надо что то. Поэтому всё делается через suspend внутри корутин скоупа. Грузчик как бы несёт ящик, но если надо отвлечся - отвечает людям на кассе, время от времени перекуривает, а затем продолжает выполнять перемещение тяжестей. Это наш .collect {} который запускает процесс подготовленный в первом пункте. Т.е. если мы добавим suspend к функции что возвращает флоу мы просто сделаем неблокирующей функцию, которая создает сам флоу, сам план действий, что само по себе не должно занимать много процессорного времени. Поправьте меня, пожалуйста, если где то ошибся.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта