Comments 12
Подскажите зачем нужен вызов delay(100) в fibonacciFlow
И почему именно 100, а не 10 или 50 или 200? Получается какое-то магическое число неизвестно откуда взятое.
Похоже, delay нужен чтобы визуально код не сыпал на консоль сразу весь результат работы, а делал это с паузами, давая время заметить, что что-то внутри происходит. По шагам. Ну как-то так.
@Ioanna Может быть, имеет смысл выдавать для наглядности информацию о каждом шаге из самого цикла while
, тогда и delay можно убрать?
Нет, вызов delay() здесь нужен потому, что это suspend-функция, без которой не будет асинхронности.
А чем плох emit() для этой цели?
Да, emit() - тоже suspend-функция, но она приостановит выполнение только в случае ожидания потребителя, а delay() - гарантированно.
В учебных примерах обычно вставляют delay() вместо реальных suspend-функций, создавая искусственную задержку. Т.е. в реальной жизни задержки и так неизбежны, а в учебных примерах мы их искусственно создаем.
Просто задержка перед повтором операции. Если есть желание повесить поток, то можно убрать.
В целом для холодного потока ограничение во флоу через delay нормальная практика.
Если мы посмотрим на метод debounce во флоу, то он позволит пропускать изменения, только если они не менялись в течении определенного времени. Не всегда же обновлять UI , так можно и привиснуть.
Так же в документации есть замечательные методы для соединения потоков данных (combine и zip), так же для переключения потоков данных flatMapLatest и другие. Возможности выделить из цепочки преобразований данные onEach.
При желании из холодного потока можно сделать горячий через stateIn. (Каждый подписчик на холодный поток вызывает всю цепочку преобразований) Но если перед передачей к подписчикам сделать его горячим, то холодный будет только один до горячего, а дальше расходиться к каждому подписчику.
В целом тема обширная и дает очень много возможностей.
На данный момент лучший выбор для архитектуры UDF
Я просто процитирую свой же учебный курс по корутинам:
Указание модификатора
suspend
само по себе еще не превращает функцию в точку приостановки. Чтобы заслужить это гордое имя, функции придется вызвать одну из функций, которые действительно приостанавливают выполнение (например,delay
,withContext
,yield
и т. д.), или реализовать аналогичное поведение самостоятельно с помощьюsuspendCoroutine
илиsuspendCancellableCoroutine
.Как уже говорилось, функция
delay()
выступает как точка приостановки, где корутина засыпает, уступая управление другому коду, и где она затем просыпается для возобновления работы.Параметр
delay()
— число миллисекунд для задержки. Оно может быть и нулевым, и отрицательным. Оба случая просто сведут действие функции на нет.
Ныряем в холодные потоки Kotlin Flow