Разбираемся в мобильной разработке (Android/iOS) и пытаемся выяснить, зачем оно так устроено
Статистика/цены: @dolgo_polo_dev_stats
По вопросам/рекламе: @dolgopolovdenis
Post #51
2.25K
Kotlin Coroutine. Suspend — зачем и как?
suspend — ключевое слово, которое говорит компилятору о том, что в функцию нужно добавить (и передать при вызове) аргумент типа Continuation
Continuation — интерфейс, который содержит одну функцию resumeWith(result: Result<T>). то есть обычный колбэк
когда suspend-функция выполнила работу, она должна вызвать continuation.resumeWith(result)
если она этого не сделает, то корутина, вызвавшая эту suspend-функцию, просто зависнет
после вызова колбэка, корутина, запустившая suspend-функцию, получит результат (если функция обещала что-то вернуть) и продолжит работу
примечание: разработчику самому нужно вызывать continuation.resumeWith(result) только когда он использует suspendCoroutine { ... }. в остальных корутин-билдерах оно вызывается самостоятельно под капотом
Выводы:
• suspend само по себе не делает функцию асинхронной, только добавляет параметр при компиляции
если вы на функцию поставите клеймо suspend, но долгие операции, выполняемые в ней, не вынесите в отдельный поток, то асинхронность не случится
• suspend-функцию можно вызвать только из корутины (или другой suspend-функции)
потому что Continuation — это объект, который создается в корутине и передается suspend-функциям внутри нее
suspend — ключевое слово, которое говорит компилятору о том, что в функцию нужно добавить (и передать при вызове) аргумент типа Continuation
Continuation — интерфейс, который содержит одну функцию resumeWith(result: Result<T>). то есть обычный колбэк
когда suspend-функция выполнила работу, она должна вызвать continuation.resumeWith(result)
если она этого не сделает, то корутина, вызвавшая эту suspend-функцию, просто зависнет
после вызова колбэка, корутина, запустившая suspend-функцию, получит результат (если функция обещала что-то вернуть) и продолжит работу
примечание: разработчику самому нужно вызывать continuation.resumeWith(result) только когда он использует suspendCoroutine { ... }. в остальных корутин-билдерах оно вызывается самостоятельно под капотом
Выводы:
• suspend само по себе не делает функцию асинхронной, только добавляет параметр при компиляции
если вы на функцию поставите клеймо suspend, но долгие операции, выполняемые в ней, не вынесите в отдельный поток, то асинхронность не случится
• suspend-функцию можно вызвать только из корутины (или другой suspend-функции)
потому что Continuation — это объект, который создается в корутине и передается suspend-функциям внутри нее
- 🔥 16
- 👍 7