LoginSignup
105
91

More than 3 years have passed since last update.

SwiftのGCD(非同期処理)について

Last updated at Posted at 2016-06-09

並列処理をしたり非同期で処理をしたりする処理を今まではコピペでやっていただけなのできちんと調べる。

まず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 = 優先度
実行処理は{}の中

105
91
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
105
91