てくてくテック

気ままに開発のメモを書いていこうと思います。主にSwiftかと。

Swift3のGCD(dispatch_async)

はじめに

Swift3でのGCD(dispatch_async)の使い方が変わっていたのでメモメモ

Grand Central Dispatch(GCD)とは

タスクを非同期に実行する技術のひとつとして、Grand CentralDispatch(GCD)というものがありま す。通常はアプリケーション中に記述するスレッド管理用のコードを、システムレベルで実装したも のです。開発者がしなければならないのは、実行したいタスクを定義し、適切なディスパッチキュー に追加することだけです。するとGCDは、必要なスレッドを生成し、そこでタスクを実行するよう適 切にスケジューリングします。スレッド管理がシステムの一部として組み込まれているので、全体を 見渡してタスクを管理、実行でき、従来のスレッドよりも効率が向上します。

並列プログラミングガイドより

要するにiOSで並列処理をするための機構のことで、システムレベルで実装されているものです。GCD以外にもThreadクラスを用いて実現することもできますが、GCDの方が楽です。詳細はmixi-inc/iOSTrainingを参照してください。

なんで並列処理するのか?

端的に言うとアプリが固まるから。
というのも、iOSではUI系の処理はメインスレッドで実行されるため(逆に言うとUI系の処理はメインスレッドで実行しないといけません。)、重い処理などをメインスレッドで実行してしまうとUI系の処理が進まなくてアプリが固まった状態になってしまうからです。
そのため,重い処理などをする際は別スレッドで実行しなければなりません。

コードサンプル

とりあえずは下記のようにすれば動きます。

DispatchQueue.global(qos: .default).async {
    // 重い処理
    DispatchQueue.main.async {
        //メインスレッド
    }
}

DispatchQueue.global(qos: .default) は各アプリに用意されている並列ディスパッチキューの一つです。qosを変えることで優先度を調整することができます。
[Swift 3] Swift 3時代のGCDの基本的な使い方に詳しく書いてあるので興味のある方はこちらを参照してください。

ちなみにSwift2.2では下記のように書いていました

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    // 重い処理

    dispatch_async(dispatch_get_main_queue(), {
          // メインスレッド
    });
})