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