[執筆中][2020/08/10更新][Swift][ObjC] Dispatch Queue (GCD=Grand Central Dispatch) の使い方

この記事は執筆中です。完成まで少し時間がかかるので、途中の段階から公開しています。

SwiftやObjective-CではDispatch Queue (別名GCD=Grand Central Dispatch) を使って、並列分散処理や非同期処理を書くことができます。この記事ではDispatch Queueの使い型を解説します。

スポンサーリンク

キューを作る

Dispatchは実行する処理をSwiftではクロージャー、Objective-Cではブロックで積んでいくキューです。キューに積まれた処理はサブスレッド上で実行されます。メインスレッド上で処理を実行するメインキューもあります。FoundationにはOperationQueue (NSOperationQueue) もあります。OperationQueue は Dispatch Queue を利用したキューで、Dispatch Queue を直接使うよりも柔軟な制御ができます。例えば、キューにキャンセル処理などを実装したい場合には、 Dispatch Queue を使うよりも OperationQueue を使った方が簡単に実装できるでしょう。

メインキューを取得する

メインキューは積まれた処理をメインスレッドで実行するキューです。UIKitのコントロールの状態変更など、表示更新を伴う処理はメインスレッドで行う必要があります。サブスレッドで何かを行っていて、メインスレッド側で表示更新したいときには、サブスレッドからメインキューに処理を積むようにします。

メインキューを取得するコードは次の通りです。

// Swift
let mainQueue = DispatchQueue.main
// Objective-C
dispatch_queue_t mainQueue = dispatch_get_main_queue();

なお、私の経験では、サブスレッドから大量の表示更新処理を委譲すると、処理が追いつかずに、もっさりした動作になってしまうことがあります。お勧めは、委譲するのではなく、次のような処理にする方法です。

  1. メインスレッドはタイマーで表示内容を入れるプロパティを定期的に監視し、表示を更新する。
  2. サブスレッドは、表示内容を入れるプロパティを更新する。
  3. 表示内容を入れるプロパティは複数スレッドから同時アクセスできるように同期を行う。

大量の更新が発生しないときは、メインキューに処理を積むという方法でも十分です。

システムの定義済みキューを取得する

バックグラウンド処理を行うときとか、一時的に使うキューが欲しいときとかには、システムの定義済みキューが便利です。システムの定義済みキューを取得するコードは次の通りです。

// Swift
let queue = DispatchQueue.global(.default)
// Objective-C
dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0);

引数に指定しているのは、キューの種類です。次のものが定義されています。

Swift Objective-C 説明
DispatchQoS.userInteractive QOS_CLASS_USER_INTERACTIVE ユーザーインターフェイス用のキュー。アニメーションやイベントのトラッキング用に使う
DispatchQoS.userInitiated QOS_CLASS_USER_INITIATED ユーザー操作によって起きる処理で、ユーザーインターフェイス用のキューよりも一段階下の優先度で動かすキュー
DispatchQoS.default QOS_CLASS_DEFAULT デフォルト
DispatchQoS.utility QOS_CLASS_UTILITY バックグラウンドタスクではないが、長時間後ろで動き続けるようなものなどに使用するキュー。
DispatchQoS.background QOS_CLASS_BACKGROUND バックグラウンドタスク用のキュー。アプリがバックグラウンドにある間も動くキュー

コンカレントキューを作る

(原稿作成中)

シリアルキューを作る

(原稿作成中)

Dispatchのオブジェクトを破棄する(Objective-Cのみ)

(原稿作成中)

キューでブロックを実行する

(原稿作成中)

同期実行する

(原稿作成中)

非同期実行する

(原稿作成中)

分散実行する

(原稿作成中)

セマフォを使う

(原稿作成中)

セマフォを作る

(原稿作成中)

セマフォをシグナル状態にする

(原稿作成中)

セマフォがシグナル状態になるまで待機する

(原稿作成中)

アプリ起動後一回だけ実行する

(原稿作成中)

タイマーを作る

(原稿作成中)

スポンサーリンク
最新情報をチェックしよう!
>現役のプログラマーが書くプログラミング情報

現役のプログラマーが書くプログラミング情報

日々の開発の中での学びや分かったこと、調べたことなどを書いていくブログです。

CTR IMG