👋

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)
  1. await fetchData() を呼ぶ
    fetchData は非同期関数なので「すぐに結果を返せない」
    そのため、この行で処理を中断して、fetchData が完了するのを待つ
    ただし UI スレッド(メインスレッド)はブロックされないのでアプリは固まらない

  2. fetchData が完了したら、結果(例: data)を持って この行の続きから再開する

  3. 次に await process(data) が実行される
    これも同じく「完了するまで一旦中断」して、終わったら再開

  4. process が完了したら updateUI(output) を実行する

📕ここまでのまとめ

  • Swift Concurrency は「非同期処理・並行処理を安全にわかりやすく書くための仕組み」

  • 同期処理 は「終わるまで待つ」、非同期処理 は「待っている間に他のこともできる」

  • 従来はクロージャーで書く必要があり、ネストが深くなり「コールバック地獄」になりやすかった

  • async/await を使うと、非同期処理を同期処理のように直線的に書ける

  • await は「一時停止ボタン」:処理を中断し、完了したら続きから再開する

  • ポイント:中断しても UI スレッドは止まらないので、アプリは固まらない

🏃‍♀️次の記事で勉強すること

  • Task と async let の違い

  • MainActor を使って UI を安全に更新する

  • actor でデータ競合を防ぐ

Discussion