iOS開発マルチスレッドGCD(二)


前章ではiOSマルチスレッドについて簡単に説明しましたが、この章ではGCDマルチスレッドについて説明します.
GCD(Grand Central Dispatch)はiOSマルチタスクの核心です.Mac OS X 10.6アザラシで初めて発売され、iOS 4.0に導入された.GCDはCベースのAPIであり、下位層のフレームワークであるため、最も効率的である
一、グループ管理
/*
                             
                                                         0             
     */
    //1.           
    dispatch_group_t myGroup = dispatch_group_create();
    
    //2.                       
    //                               (   )
    
    //dispatch_queue_t                                                                                                         
    
    //dispatch_get_global_queue()
    
    dispatch_queue_t HIGH = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_queue_t DEFAULT = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_queue_t LOW = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    dispatch_queue_t BACKGROUN = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    //0                0       0                            
    
    //3.                        
    dispatch_group_async(myGroup, BACKGROUN, ^{
        for(int i = 0; i < 5; i++){
            NSLog(@"DISPATCH_QUEUE_PRIORITY_BACKGROUND");
        }
    });
    
    dispatch_group_async(myGroup, LOW, ^{
        for(int i = 0; i < 5; i++){
            NSLog(@"DISPATCH_QUEUE_PRIORITY_LOW");
        }
    });
    
    dispatch_group_async(myGroup, DEFAULT, ^{
        for(int i = 0; i < 5; i++){
            NSLog(@"DISPATCH_QUEUE_PRIORITY_DEFAULT");
        }
    });
    
    dispatch_group_async(myGroup, HIGH, ^{
        for(int i = 0; i < 5; i++){
            NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH");
        }
    });
    
    //dispatch_group_notify()                     
    //dispatch_get_main_queue()      
    dispatch_group_notify(myGroup, dispatch_get_main_queue(), ^{
        NSLog(@"           ");
        
    });
    
    /*
       :                                        
       :        ,               ,         ,           ,                  
     */

二、自分でキューを作成して管理する
    //1.      
    dispatch_queue_t myQueue = dispatch_queue_create("MY_QUEUE", DISPATCH_QUEUE_SERIAL);
    //   :C       
    //   :         DISPATCH_QUEUE_SERIAL    DISPATCH_QUEUE_CONCURRENT  
    //2.            
    dispatch_async(myQueue, ^{
        for (int i = 0; i < 5; i++) {
             NSLog(@"     !");
        }
    });
    
    dispatch_async(myQueue, ^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"     ");
        }
    });
    
    dispatch_async(myQueue, ^{
        NSLog(@"    !");
    });
    //  :                   GCD                  
    

三、ホームチームの獲得
dispatch_queue_t mainQueue = dispatch_get_main_queue();

四、キューの一時停止とリカバリキュー
/*
    dispatch_suspend(myQueue);//      
    
    //              。               retain release  。  dispatch_suspend       , dispatch_resume    。                     。
    dispatch_resume(myQueue);//                
     */
    dispatch_queue_t queue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
    //     block,  5   。
    dispatch_async(queue, ^{
        sleep(5);
        NSLog(@"After 5 seconds...");
    });
    //     block,    5   
    dispatch_async(queue, ^{
        sleep(5);
        NSLog(@"After 5 seconds again...");
    });
    //    
    NSLog(@"sleep 1 second...");
    sleep(1);
    //    
    NSLog(@"suspend...");
    dispatch_suspend(queue);
    //  10 
    NSLog(@"sleep 10 second...");
    sleep(10);
    //    
    NSLog(@"resume...");
    dispatch_resume(queue);

五、GCD実用.
//      :        
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });

 //      :    
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });

また、GCDマルチスレッドは、ファイルのダウンロードなど、プログラムの操作に時間がかかる場合の防除プログラムの偽死を処理することができる.
GCDのもう一つの用途は、プログラムをバックグラウンドで長く実行できることです.
GCDを使用していない場合、appがホームキーを押して終了した後、appは最大5秒でリソースを保存またはクリーンアップする作業を行います.しかし、GCDを使用すると、appは最大10分でバックグラウンドで長く動作します.この時間は、ローカルキャッシュのクリーンアップ、統計データの送信などの作業に使用できます.