六.GCDキューグループ

5477 ワード

一.キュー・グループの基本概念
  • キューグループは、キュー内のタスクを管理するための実行
  • である.
  • 一般使用手順:
  • キューグループ
  • を作成
  • キュー
  • を作成
  • キューグループ非同期関数を使用してタスクをカプセル化し、キューにコミットする
  • 現在のすべてのタスクが実行されている場合を、キューグループの傍受の範囲
  • に組み入れる.

    二.キュー・グループの簡単な使用:リスニング・タスクの完了
  • すべてのタスクが同時に実行されます(シーケンスなし)
  • すべての非同期関数は、キューに追加され、キューグループのリスニング範囲
  • に組み込まれる.
  • は、dispatch_group_notify( , )の関数を使用して、この関数上のタスクの実行が完了するかどうかを傍受し、タスクが完了すると、この方法
     // 1.      
     dispatch_group_t group = dispatch_group_create();
     
     // 2.       
     dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);
     
     // 3.         
     dispatch_group_async(group, queue, ^{
         NSLog(@"1---%@", [NSThread currentThread]);
     });
     
     dispatch_group_async(group, queue, ^{
         NSLog(@"2---%@", [NSThread currentThread]);
     });
     
     dispatch_group_async(group, queue, ^{
         NSLog(@"3---%@", [NSThread currentThread]);
     });
     
     dispatch_group_async(group, queue, ^{
         NSLog(@"4---%@", [NSThread currentThread]);
     });
     
     // 4.            
     dispatch_group_notify(group, queue, ^{
         NSLog(@"    ");
     });
    
  • を呼び出す.
    三.キューグループと関数ペア
  • キューグループの関数対用法は現在珍しい用法であり、この用法は比較的古いものであり、利点はキューグループに入るタスク
  • を厳格に制御/傍受することである.
  • この方法は非同期関数
  • しか使用できない.
  • 基本手順:
  • まずキューグループ作成関数を使用して、キューグループ
  • を作成します.
  • 同時キュー
  • を作成
  • は、キューグループを開き、非同期関数を使用して各タスク
  • をカプセル化する.
  • タスクの実行が終了した後、キュー・グループに追加されたタスクをキュー・グループから削除する(参照カウント管理と同様に、カウント+1はカウント-1を伴う必要がある)+キュー・グループは通常dispatch_group_wait連用、キューグループ内のタスクX秒待ち、その後後続のタスク
      - (void)groupQueue2 {
          
          // 1.      
          dispatch_group_t group = dispatch_group_create();
          
          // 2.     
          dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
          
          // 3.       --             
          dispatch_group_enter(group);
          // 4.           
          dispatch_async(queue, ^{
              NSLog(@"1---%@", [NSThread currentThread]);
              // 5.         ,         
              dispatch_group_leave(group);
          });
          
          dispatch_group_enter(group);
          dispatch_async(queue, ^{
              NSLog(@"2---%@", [NSThread currentThread]);
              dispatch_group_leave(group);
          });
          
          dispatch_group_enter(group);
          dispatch_async(queue, ^{
              NSLog(@"3---%@", [NSThread currentThread]);
              dispatch_group_leave(group);
          });
          
      //    //     
      //    dispatch_group_notify(group, queue, ^{
      //        NSLog(@"    ");
      //    });
      
          //     ,     time           ,             ,   0,     ,    0 
          dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 0.00000002 * NSEC_PER_SEC);
          
          //   tiemr    ,           ,       ,              0,      
          long n = dispatch_group_wait(group, timer);
          NSLog(@"%ld", n);
          
          NSLog(@"----end------");
      }
    
  • の実行を継続する

    四.キューグループの小さなインスタンスを使用する--2枚の画像をダウンロードし、合成して表示します.
    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
    
        // 1.      
        let group = dispatch_group_create()
        
        // 2.       
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
        
        // 3.       1
        dispatch_group_async(group, queue) { () -> Void in
            
            //   URL
            guard let url = NSURL(string: "http://wanzao2.b0.upaiyun.com/system/pictures/33164301/original/1455500488_500x500.png") else {
                return
            }
            
            //   URL      
            guard let data = NSData(contentsOfURL: url) else {return};
            //  URL    
            let image = UIImage(data: data)
            self.image1 = image
            debugPrint(NSThread.currentThread())
        }
        
        // 4.       2
        dispatch_group_async(group, queue) { () -> Void in
            
            guard let url = NSURL(string: "http://ww1.sinaimg.cn/large/e389bb44jw1efrld60zctj20cs0bdglv.jpg") else {return}
            guard let data = NSData(contentsOfURL: url) else {return}
            let image = UIImage(data: data)
            self.image2 = image
            debugPrint(NSThread.currentThread())
        }
        
        //             ,             ,       
        
        /*
        // 5.1       ,           ,         ,            
        dispatch_barrier_async(queue) { () -> Void in
            debugPrint("barrier--------")
        }
        // 5.2        ,        UI  
        dispatch_group_async(group, queue) { () -> Void in
            UIGraphicsBeginImageContext(CGSizeMake(200, 200))
            
            self.image1?.drawInRect(CGRectMake(0, 0, 200, 100))
            self.image2?.drawInRect(CGRectMake(0, 100, 200, 100))
            
            let image = UIGraphicsGetImageFromCurrentImageContext()
            
            //        UI
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.imageView.image = image
            })
        }
        */
        
        // 6.1       ,              ,                 ,             
        //                ,             
        dispatch_group_notify(group, queue) { () -> Void in
            UIGraphicsBeginImageContext(CGSizeMake(200, 200))
            
            self.image1?.drawInRect(CGRectMake(0, 0, 200, 100))
            self.image2?.drawInRect(CGRectMake(0, 100, 200, 100))
            
            let image = UIGraphicsGetImageFromCurrentImageContext()
            
            //        UI
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.imageView.image = image
            })
        }
    }