Pull to refresh

Comments 12

Подскажите зачем нужен вызов delay(100) в fibonacciFlow

И почему именно 100, а не 10 или 50 или 200? Получается какое-то магическое число неизвестно откуда взятое.

Похоже, delay нужен чтобы визуально код не сыпал на консоль сразу весь результат работы, а делал это с паузами, давая время заметить, что что-то внутри происходит. По шагам. Ну как-то так.

@Ioanna Может быть, имеет смысл выдавать для наглядности информацию о каждом шаге из самого цикла while, тогда и delay можно убрать?

Нет, вызов delay() здесь нужен потому, что это suspend-функция, без которой не будет асинхронности.

А чем плох emit() для этой цели?

Да, emit() - тоже suspend-функция, но она приостановит выполнение только в случае ожидания потребителя, а delay() - гарантированно.

В учебных примерах обычно вставляют delay() вместо реальных suspend-функций, создавая искусственную задержку. Т.е. в реальной жизни задержки и так неизбежны, а в учебных примерах мы их искусственно создаем.

Про имитацию реальной работы понятно. Мне скорее непонятно что она нам демонстрирует в конкретном примере. Иными словами что поменяется в поведении этого кода без delay?

Поток будет выплевывать очередное число без драматической задержки :-)

Просто задержка перед повтором операции. Если есть желание повесить поток, то можно убрать.

В целом для холодного потока ограничение во флоу через delay нормальная практика.

Если мы посмотрим на метод debounce во флоу, то он позволит пропускать изменения, только если они не менялись в течении определенного времени. Не всегда же обновлять UI , так можно и привиснуть.

Так же в документации есть замечательные методы для соединения потоков данных (combine и zip), так же для переключения потоков данных flatMapLatest и другие. Возможности выделить из цепочки преобразований данные onEach.

При желании из холодного потока можно сделать горячий через stateIn. (Каждый подписчик на холодный поток вызывает всю цепочку преобразований) Но если перед передачей к подписчикам сделать его горячим, то холодный будет только один до горячего, а дальше расходиться к каждому подписчику.

В целом тема обширная и дает очень много возможностей.

На данный момент лучший выбор для архитектуры UDF

Я просто процитирую свой же учебный курс по корутинам:

Указание модификатора suspend само по себе еще не превращает функцию в точку приостановки. Чтобы заслужить это гордое имя, функции придется вызвать одну из функций, которые действительно приостанавливают выполнение (например, delaywithContextyield и т. д.), или реализовать аналогичное поведение самостоятельно с помощью suspendCoroutine или suspendCancellableCoroutine.

Как уже говорилось, функция delay() выступает как точка приостановки, где корутина засыпает, уступая управление другому коду, и где она затем просыпается для возобновления работы.

Параметр delay() — число миллисекунд для задержки. Оно может быть и нулевым, и отрицательным. Оба случая просто сведут действие функции на нет.

Ну вы так и не ответили на мой вопрос, откуда взялось число 200 в вашем примере. Как разработчик, я хочу получить преимущества асинхронной обработки, но задержки 200 мс на каждой итерации выглядит не очень. Почему не указать 2 мс? Как вычислить оптимальное значение?

Для учебного примера число выбрано произвольно. В реальном коде на этом месте будет какая-то другая suspend-функция, возвращающая какие-то данные.

Теперь понятно, спасибо. А то в статье вы описали все функции из примера, а про delay пропустили.

Sign up to leave a comment.

Articles