初期使用GCD

4681 ワード

http://lcwangchao.github.com/IOS/2012/06/07/gcdbegin/
GCD(Grand Central Dispactch)は、Apple社が開発した技術であり、多核環境における同時動作を最適化し、従来のマルチスレッドのプログラミングモードに取って代わることを目的としている.Mac OS X 10.6とIOS 4.0の後にGCDのサポートを開始します.
GCDを使う理由の一つは便利です.以前のマルチスレッドプログラムを振り返ってみます.非同期のコードを別の関数に入れてNSThreadで新しいスレッドを開いてこのコードを起動します.このようなジャンプの流れは複雑な論理にとってはまさに災難です.もっと悪いのは、スレッドを呼び出す時の環境は非同期コードに対しては見えません.もし私達が当時の臨時変数が必要なら、2つの選択しかありません.クラスメンバー変数に保存したり、パラメータとして過去に伝えたりします.前者は奇妙な関係のないメンバーが多いが、後者の機能は限られている.
GCDは相対的にもっと優雅な方式です.コードを見てください.
NSString* parameter = [self getSomeParameter];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSString* result = [self fetchResultFromWebWithParameter:parameter];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self updateUIWithResult:result];
    });
});
上のコードには、変なフォーマットがあります.
^{code...}
説明します.コードの一部が括弧で包まれて、先頭にとがった番号を置くとき、ブロックと呼ばれます.C言語を学んだことがあるならば(実際にはblockはappleからCに対する拡張です)、これは強化型の関数ポインタだと考えられます.それは変数として繰り返し伝達するだけでなく、自分の環境以外の変数(上のコードのparameter)を参照することもできます.より詳細には、appleのC拡張におけるクローズドの実現である.blockで引用する対象は自動的にretainされますので、メモリの問題を心配する必要はありません.
さらに三つの関数に触れました.
void dispatch_async(
    dispatch_queue_t queue,
    dispatch_block_t block);

dispatch_queue_t dispatch_get_global_queue(
    long priority,
    unsigned long flags); 

dispatch_get_main_queue();  
dispatch_async 関数は、入力されたブロックを指定されたqueueに入れて実行します.この関数は非同期であり、このことはblockが動作終了したかどうかにかかわらずすぐに戻ります.したがって、UIスレッドをブロックすることなく、ブロック内で様々な時間を消費する動作(ネットワーク要求など)を実行することができる.  dispatch_ゲットするglobal_queue グローバルキューを取得します.システムが私たちのために開いているいくつかのグローバルスレッドとして一応理解します.私たちはプリオリティでキューの優先度を指定しますが、フラッグは予約フィールドとしてバックアップします.  dispatch_ゲットするメーンqueue ホームチームに戻ります.つまりUI列です.一般的には、他の列で非同期的に作業を完了した後、UIキューでインターフェースを更新する必要があります.
はい、これらの特性を知ってから、上記のコードを理解することができます.parameter変数を利用して、非同期的にネットワーク要求を開始し、要求後にUIスレッドを更新します.
その他
Appleの公式blockプログラミングガイド  Apple公式GCDガイド