iOSマルチスレッド開発シリーズの(3)Grand Central Dispatch(GCD)

2945 ワード

上の2編ではNSThreadとNSOperationの使い方を紹介していますが、この3つ目のマルチスレッド開発GCDの紹介です
紹介:
GCDはアップル社がiOS 4+以降に発売したマルチスレッド技術であり、アップルが力を入れて推薦したものでもある.C言語に基づいて開発されたため、効率性は比類がないが、学習の難しさは他の2つ以上かもしれない.
シリアルキューの作成
  • dispatch_を使用queue.create関数
  • プライマリ・キューの使用:dispatch_の使用get_メーンQueue()獲得ホームチーム列
    dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);  
    
  • 最初のパラメータはキューの名前で、デバッグするときに役立ちます.アップルのお勧めは、com.baidu.wwwなどの逆会社のウェブサイト名です.
    2番目のパラメータは、nilまたはDISPATCH_の場合、キューのタイプです.QUEUE_SERIALはシリアルキュー
        dispatch_queue_t queue = dispatch_get_main_queue();       (  )
    

    並列キューの作成
    dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);  
    

    2番目のパラメータは次のように設定されています.
                    DISPATCH_QUEUE_CONCURRENT
    
    dispatch_queue_t queue=dispatch_get_global_queue(long identifier, unsigned long flags); 
    

    最初のパラメータでは、並列キューの優先度を設定できます.上位、中、下位の3つの優先度キューに分けられます.
    #define DISPATCH_QUEUE_PRIORITY_HIGH 2 
    #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
    #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
    

    同期タスクの作成
    dispatch_sync(queue, ^{
        //block    
    }); 
    

    非同期タスクの作成
    dispatch_async(queue, ^{
        //block    
    });  
    

    いくつかの状況をシミュレートします
    ケース1:タスクを一度に実行する(単一モードで使用)
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    // code to be executed once
    });
    

    ケース2:大量のネットワークリクエスト
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
      //            
    
      dispatch_sync(dispatch_get_main_queue(), ^{
        //       UI  
    
      });
    });
    

    ケース3:N秒遅延であるタスクを実行する:
    double delayInSeconds = N;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    // code to be executed on the main queue after delay
    }); 
    

    ケース4:データのロードが完了した後、バックグラウンドでデータを保存する(キャッシュ時)
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
        });
    

    ケース5:キューに参加する前のblockが実行されてから実行され、実行が完了するとキューに参加した後のblockが実行されます.
        dispatch_barrier_async(dispatch_queue_t queue, ^{
    
    }); 
    

    ケース6:非常に多くのデータはマルチスレッド処理を必要とし、処理が遊ばない後に1つのメインスレッドにまとめて実行する(ケース1のシナリオと一致する)
       dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
     //       
    });
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
       //       
    });
    dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
     //     
    });
    

    GCDのもう一つの応用
    ホームキーをクリックしてアプリケーションを閉じると、5秒後にこのアプリケーションがメモリで実行されなくなり、GCDを利用してアプリケーションが10分間バックグラウンドで生存できるようになり、収集されていないデータをサーバに軽く転送し、データの保存整理とまとめを行うことができます.