並列処理をしたり非同期で処理をしたりする処理を今まではコピペでやっていただけなのできちんと調べる。
まずGCDとは
Grand Central Dispatchの略
mac osやiOSが持っている非同期に処理を実行する技術のこと
appleのドキュメントには
通常はアプリケーション中に記述するスレッド管理用のコードを、システムレベルで実装したも
のです。開発者がしなければならないのは、実行したいタスクを定義し、適切なディスパッチキュー
に追加することだけです。するとGCDは、必要なスレッドを生成し、そこでタスクを実行するよう適
切にスケジューリングします。スレッド管理がシステムの一部として組み込まれているので、全体を
見渡してタスクを管理、実行でき、従来のスレッドよりも効率が向上します。
と書いてあるので、プログラムを書く人はディスパッチキューに追加するだけで使用可能
使い方
サンプル
###2017/2/24 Swift3用に追記
// サブスレッドで実行
DispatchQueue.global(qos: .default).async {
// サブスレッド(バックグラウンド)で実行する方を書く
DispatchQueue.main.async {
// Main Threadで実行する
}
}
DispatchQueue.global(qos: .default) = システムで用意されたキューを使用
自分でラベル名を指定してキューを作成する場合は
DispatchQueue(label: "jp.hogehoge.app.queue")
のようにする
async = 非同期
DispatchQueue.main.async = メインスレッドで実行
複数並列で行う場合
複数処理を走らせ、完了したら処理を行う場合は DispatchGroup()
にenterして、その間に DispatchQueue
を走らせる。
完了したら dispatchGroup.notify
の中が実行される.
let dispatchGroup = DispatchGroup()
// 並列なのでconcurrentを追加。指定しな場合は直列
let dispatchQueue = DispatchQueue(label: "label name", attributes: .concurrent)
// 実際はここでfor文とかで回す
dispatchGroup.enter()
dispatchQueue.async(group: dispatchGroup) {
print("なんかの処理")
dispatchGroup.leave()
}
// dispatchQueが完了したら呼ばれる
dispatchGroup.notify(queue: .main) {
print("終わった")
}
以下、以前の書き方(エラー出ます)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
// Backgroundで実行
dispatch_async(dispatch_get_main_queue(), {
// Main Threadで実行する
});
});
これで非同期処理で実行される。
それぞれの意味
dispatch_async =非同期処理
dispatch_get_global_queue = グローバルキュー バックグラウンドで実行する方
dispatch_get_main_queue = メインキュー メインスレッドで実行する方
DISPATCH_QUEUE_PRIORITY_DEFAULT = 優先度
実行処理は{}の中