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

  • 2025年4月26日
  • 2025年4月26日
  • Swift
  • 2View
  • 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を使い分けると、アプリの動作がよりスムーズになり、電池の消耗も抑えられることがあります🔋✨