GCD常用方法

1622 ワード

1. dispatch_async非同期キューへの追加


Demo:
//  
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1
        // to do some thing here

        //  ( : UI)
        dispatch_async(dispatch_get_main_queue(), ^{ // 2
             // 3  UI
        });
    });

2. dispatch_after遅延キューへの追加


Demo:
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); // 1 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // 2 
        // to do some thing here
    });

3. dispatch_onceは一度だけ実行することを保証します


ocでdispatch_を使うonceは、オブジェクトが一意であることを保証する単一のオブジェクトを作成します.

4. dispatch_barrier_async GCD障害


barrierの役割は、前に追加したタスクの実行が完了してから現在のdispatch_を開始することです.barrier_asyncメソッドが追加したタスクで、その後追加したタスクはbarrierタスクが実行されるまで待たなければなりません.共有リソースにロックをかける役割を果たすことができます.
次に、障害関数を使用する場合、いつ--できない場合を示します.
カスタムシリアルキュー:悪い選択です.障害は何の役にも立たない.なぜなら、シリアルキューは一度に1つの操作しか実行されないからだ.グローバル同時キュー:注意してください.これは最善のアイデアではないかもしれません.他のシステムがキューを使用している可能性があり、自分の目的だけを独占することはできません.カスタムコンカレントキュー:これは原子または臨界領域コードにとって極めて良い選択です.スレッドのセキュリティを設定またはインスタンス化する必要があるものは、使用障害の最適な候補です.

5. dispatch_sync同期キューへの追加


ジョブを同期してコミットし、戻る前に完了を待つ.
現在のキューでdispatch_を実行する場合syncはデッドロックを引き起こす
次は、dispatchをいつ使用するか、どこで使用するかについてのクイック・サマリーです.sync :
カスタムシリアルキュー:この状況では注意してください.キューで実行してdispatchを呼び出すとsyncは同じキューに配置され、100%デッドロックを作成します.メインチーム列(シリアル):上記の理由と同じように、非常に注意しなければなりません.この状況は同様にデッドロックを引き起こす可能性がある.≪コンカレント・キュー|Consolident Queue|emdw≫:スケジュールの障害によっても、タスクの完了を待つ必要があっても、同期作業を行うには良い選択です.