[Swift] 高校生でもわかる!DispatchQueueのmainとglobalの違いをやさしく解説

  • 2025年4月26日
  • 2025年4月26日
  • Swift
  • 198View
  • 0件

DispatchQueueとは?

SwiftやSwiftUIでアプリを作るときによく出てくるのが DispatchQueue(ディスパッチキュー)。これは、「いつ・どこで・どうやって処理を動かすか」をコントロールする係です。

プログラムの中では、いろいろな仕事(処理)が一度に発生します。そんなとき、順番を決めたり、スムーズに進めるためにDispatchQueueが必要になります。

お弁当屋さんで例えると?

アプリを「お弁当屋さん」だと考えてみましょう。

  • 店員さん(=iPhoneのCPU)が
  • 注文(=プログラムの処理)を
  • どの順番でさばくかを決めるのがDispatchQueue

つまり、DispatchQueue=店長のような指示役です。

mainとglobalの違い

DispatchQueueには主に2つの種類があります。

Queue名 担当する仕事 例え
DispatchQueue.main ユーザーに見える部分(UI)の処理 レジ係(店長)がお客様対応する
DispatchQueue.global() 裏方の作業(ダウンロードや計算) 厨房スタッフが弁当を作る

mainでやるべき仕事

  • ボタンを押したら色を変える
  • テキストを更新する
  • 画面に画像を表示する

globalでやるべき仕事

  • ネットからデータをダウンロード
  • 大量のデータを計算する
  • 時間のかかる処理全般

Swiftコードで見るとこう!

たとえば、インターネットから画像をダウンロードして画面に表示する場合、こんな感じになります。


DispatchQueue.global().async {
    // 裏方で画像をダウンロード
    let image = downloadImage()

    DispatchQueue.main.async {
        // メインのレジ係が画面に画像を貼りつける
        self.imageView.image = image
    }
}

ポイントは、「裏方の仕事(global)で終わったら、表の仕事(main)に渡す」という流れです!

もし全部mainでやったらどうなる?

全部の仕事をレジ係(main)一人でやったら、どうなるでしょう?

たとえば、お弁当を作っている間、お客様の注文を取れなくなりますよね。

これと同じで、アプリの場合も画面がカクカクして反応が悪くなります。最悪の場合、アプリがフリーズすることも…!

まとめ:適材適所で使い分けよう!

  • メインキュー(DispatchQueue.main)は画面に関わる仕事だけ。
  • グローバルキュー(DispatchQueue.global())は裏方の重い作業担当。
  • 終わったらメインに結果を渡して表示する!

お店もアプリも「レジと厨房をうまく分けて」仕事させることが、スムーズに動かすコツです✨

おまけ:globalの中にも種類がある!

DispatchQueue.global()の中では、実は「仕事の緊急度(優先度)」を細かく指定できます。それが QoS(Quality of Service) です。

全部で 6種類 あります!

QoS 読み方 用途 例
.userInteractive ユーザー・インタラクティブ 即時にUIに反映させたい 画面遷移、アニメーションの更新など
.userInitiated ユーザー・イニシエイテッド ユーザーの操作で始まり、すぐに結果を求められる 画像の読み込み、ボタンタップ後の処理など
.default デフォルト 特に指定がなければこれ 中程度の重要度。明示的でないglobal()はこれになる
.utility ユーティリティ 時間はかかっても良いが、完了させたい ファイルのダウンロード、データの同期など
.background バックグラウンド ユーザーが直接気づかなくてもいい処理 ログ保存、キャッシュ処理など
.unspecified アン・スペシファイド QoSを指定しない(システム任せ) あまり使わない。特殊な用途で

Swiftコードで使う例


// 最優先で実行したい処理(例:即座にUI反映)
DispatchQueue.global(qos: .userInteractive).async {
    // 高速な処理
}

// 少し余裕のある処理
DispatchQueue.global(qos: .utility).async {
    // 裏で時間をかけて実行
}

QoSはなぜ重要?

iPhoneのCPUは複数の処理を並列で実行できますが、どれを優先するかはQoSで決まります。QoSを適切に設定することで、アプリが「サクサク動いて快適」に感じられるようになります。

QoSの選び方

  • .userInteractive:すぐに画面に反映したい(最も優先)
  • .userInitiated:ユーザーの操作にすぐ応えたい
  • .default:特に指定しない通常処理
  • .utility:少し時間がかかってもいい裏処理
  • .background:ユーザーが気づかなくてもいい処理
  • .unspecified:システム任せ。基本は使わない

上手にQoSを使い分けると、アプリの動作がよりスムーズになり、電池の消耗も抑えられることがあります🔋✨