Coroutine и Async/Await
Общее
• позволяют писать асинхронный код последовательно
• позволяют асинхронным функциям возвращать результат синхронно, без явных
callback-ов (Android) / completion-ов (iOS)• раньше многопоточный код писался с помощью очередей/реактивных потоков
Coroutine
• асинхронные функции помечаются ключевым словом suspend
•
CoroutineScope — "область", для которой задаются параметры и внутри которой выполняются suspend-функции• пул-потоков задается через
Dispatcher• можно отменить выполнение отдельной
suspend`-функции или всего `CoroutineScope — cancel()• есть два основных билдера —
launch (запускает корутину) и async/await (создает корутину и возвращает результат)
CoroutineScope(Dispatcher.Main).launch {
val result = doSomething()
}
suspend fun doSomething(): String {
...
}
Async/await
• асинхронная функция помечается ключевым словом async, место вызова функции помечает как
await•
Task — это контекст, позволяющий запустить асинхронный код, относительно точки вызова. Может быть вызван, как из синхронной, так и асинхронной функции• пул потоков задается через
Actor• можно отменить выполнение async-фукнции или всего
Task — cancel()•
async-функции можно вызывать внутри Task и других async-функций
Task(priority: .medium) {
let result = await doSomething()
}
func doSomething() async throws -> [String] {
...
}
#cross_post
@dolgo_polo_dev
за помощью в подготовке материала спасибо:
• iOS @alextar04
• Android @dmitry_tsyvtsyn (aka @android_under_the_hood)
