iOSにおけるマルチスレッドのGCD応用

3065 ワード

 GCD Grand Central Dispatch , 。 :  
  • GCDは、コンピューティング密集型タスクをバックグラウンドで実行することで、APPの応答速度を向上させる.
  • GCDは、スレッドロックよりも優れたより簡単な同時モデルを提供し、同時バグを回避するのに役立ちます.
  • GCDは、一般的なタイプのコード(例えば、単一の例)を最適化するために、下位層、高性能に基づいている.

  • GCDの一般的な方法の紹介:
  • バックグラウンド実行
  • dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            // 
        });
    
  • メインスレッド実行コード
  •     dispatch_async(dispatch_get_main_queue(), ^{
            // 
        });
    
  • 一度に実行する(単一例モード用が多い)
  • static dispatch_once_t once;
        dispatch_once(&once, ^{
           // 
        });
    
  • 遅延動作実行
  • float delaySeconds = 3.0f;
        dispatch_time_t disTime = dispatch_time(DISPATCH_TIME_NOW, delaySeconds * NSEC_PER_SEC);
        dispatch_after(disTime, dispatch_get_main_queue(), ^{
            // 
        });
    
  • シリアルキューを作成します.一度に1つのタスクしか実行できません.現在のタスクが完了してから、次のタスク
  • を開始します.
        dispatch_queue_t serialQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
        dispatch_async(serialQueue, ^{
            //code  
            NSLog(@" : ");
        });
        
        dispatch_async(serialQueue, ^{
            //code  
            NSLog(@" : ");
        });
    
  • パラレルキューを作成し、可能な限り多くのタスクを開始して
  • を同時実行します.
        dispatch_queue_t concurrentQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(concurrentQueue, ^{
            //code  
            NSLog(@" : ");
        });
        
        dispatch_async(concurrentQueue, ^{
            //code  
            NSLog(@" : ");
        });
    
  • バックグラウンドの複数のスレッドを並列に実行するgroup全体のスレッドが終了するまで、実行結果
  • をまとめる.
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            // 
            NSLog(@"notify: ");
        });
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            // 
            NSLog(@"notify: ");
        });
        // group 
        dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
            // 
            NSLog(@"notify: ");
        });
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            // 
            NSLog(@"notify: ");
        });
    
  • バックグラウンドの複数のスレッドを並列に実行すると、上のスレッドがすべて実行終了した後、後のスレッド
  • の実行をまとめる.
        dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(conCurrentQueue, ^{
            // 
            NSLog(@"barrier: ");
        });
        dispatch_async(conCurrentQueue, ^{
            // 
            NSLog(@"barrier: ");
        });
        dispatch_barrier_async(conCurrentQueue, ^{
            // 
            NSLog(@"barrier: ");
        });
        dispatch_async(conCurrentQueue, ^{
            // 
            NSLog(@"barrier: ");
        });
        dispatch_async(conCurrentQueue, ^{
            // 
            NSLog(@"barrier: ");
        });
    

    後で他の適用シーンがあれば、補足します.よく書けないところがあれば、ご指摘ください.