Swift Concurrency①:まずこれは何?そしてawaitとは?
📕Swift Concurrency ってなに?
「非同期処理と並行処理を安全に・わかりやすく書くための仕組み」
です。
🍽️非同期処理と同期処理ってなんだっけ?
例え話
同期処理:レストランで「料理ができるまで待っていてください」と言われて、ずっと席でぼーっとしてる
非同期処理:「料理ができたら呼ぶので、その間スマホ見てていいですよ」
❓なんでSwift Concurrency がいいの?
今まではクロージャーなどで以下のように書いていた。
fetchData { result in
// fetchDataが終わったらprocessを呼びたい
process(result) { output in
// processが終わったらupdateUIを呼びたい
→ だからネストが深くなる
updateUI(output)
}
}
ネストが深くなり読みづらい(コールバック地獄)
Swift Concurrencyのasync/await を使うと以下のように非同期処理を同期処理のように
直線的にかける(見た目は同期処理だが非同期処理です)。
let data = await fetchData()
let output = await process(data)
updateUI(output)
❓await って何してるん?
await は一時停止ボタンと覚えてください
例えばこのようなコード
let data = await fetchData()
let output = await process(data)
-
await fetchData() を呼ぶ
fetchData は非同期関数なので「すぐに結果を返せない」
そのため、この行で処理を中断して、fetchData が完了するのを待つ
ただし UI スレッド(メインスレッド)はブロックされないのでアプリは固まらない -
fetchData が完了したら、結果(例: data)を持って この行の続きから再開する
-
次に await process(data) が実行される
これも同じく「完了するまで一旦中断」して、終わったら再開 -
process が完了したら updateUI(output) を実行する
📕ここまでのまとめ
-
Swift Concurrency は「非同期処理・並行処理を安全にわかりやすく書くための仕組み」
-
同期処理 は「終わるまで待つ」、非同期処理 は「待っている間に他のこともできる」
-
従来はクロージャーで書く必要があり、ネストが深くなり「コールバック地獄」になりやすかった
-
async/await を使うと、非同期処理を同期処理のように直線的に書ける
-
await は「一時停止ボタン」:処理を中断し、完了したら続きから再開する
-
ポイント:中断しても UI スレッドは止まらないので、アプリは固まらない
🏃♀️次の記事で勉強すること
-
Task と async let の違い
-
MainActor を使って UI を安全に更新する
-
actor でデータ競合を防ぐ
Discussion