GCDの常用方法のまとめ

4734 ワード

参考記事:http://www.jianshu.com/p/2d57c72016c6
1マルチスレッドを開く方法
  • Thread:C言語に基づいて、基本的には使われなくなりました.プログラム猿の起動と管理スレッドの宣言周期が必要です.
  • NSThread:Threadのパッケージに基づいて、oc言語は、プログラム猿の起動と管理スレッドの声明周期
  • が必要です.
  • GCD:NSThreadの代わりに、C言語に基づいて、機能が強く、自動管理スレッドのライフサイクル
  • NSOperation:GCDのパッケージは、oc言語に基づいて、自動管理スレッドのライフサイクルです.
  • 2 GCDの核心概念
  • タスク:同期実行(sync):現在のスレッドでのみタスクを実行でき、新しいスレッドを開く能力を備えていない非同期実行(async):新しいスレッドでタスクを実行でき、新しいスレッドを開く能力を備えている
  • .
  • 列:コンカレントDispactch Que:複数のタスクを同時に実行させることができます.同時並行機能は、非同期関数の下でのみ有効なシリアルキューです.タスクを次から次へと実行させます.(一つのタスクを実行した後、次のタスクを実行する)
  • 3 GCDの基本使用
    3.1スレッド間通信(サブスレッドがデータをダウンロードし、メインスレッドがUIを更新する)
    //1.        ,    ,      
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
           
            //2.    
            //2.1   URL
            NSURL *url = [NSURL URLWithString:@"https://image.baidu.com"];
            
            //2.2        
            NSData *data = [NSData dataWithContentsOfURL:url];
            
            //2.3      
            UIImage *image = [UIImage imageWithData:data];
            
            //    
            NSLog(@"download---%@",[NSThread currentThread]);
            
            //3.       UI
            // dispatch_async(dispatch_get_main_queue(), ^{
             dispatch_sync(dispatch_get_main_queue(), ^{
            
                self.imageView.image = image;
                 
                 //    
                  NSLog(@"UI---%@",[NSThread currentThread]);
            });
        });
    
    3.2 GCD常用関数
    (1)時間遅延
       //1.NStimer
        // NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:YES];
        
        //2.afterDelay
        //[self performSelector:@selector(task) withObject:nil afterDelay:2.0];
        
        //3.GCD
        //dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)),queue , ^{
            
            NSLog(@"---GCD----%@",[NSThread currentThread]);
        });
    
    (2)使い捨てコード(注意:怠惰負荷に書いてはいけません)
     static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSLog(@"---once----");
        });
    
    (3)フェンス関数
     //    :              
        dispatch_barrier_async(queue, ^{
            NSLog(@"+++++++++++++++++++++++++++");
        });
    
    (4)高速反復関数
    //1.      
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        //2.    
        /*
              :      
              :  ,    
              :block     
         */
        dispatch_apply(10, queue, ^(size_t index) {
            NSLog(@"%zd----%@",index,[NSThread currentThread]);
        });
    
    (5)キューグループ
    //  :
    /*
         1
         2
              
     */
    -(void)combie
    {
        //0.     
        dispatch_group_t group = dispatch_group_create();
        
        //1.    
        dispatch_queue_t queue  = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
            
        //2.    ,    1
        dispatch_group_async(group, queue, ^{
           
            NSLog(@"DOWNLOAD1---%@",[NSThread currentThread]);
            //2.1   URL
            NSURL *url = [NSURL URLWithString:@"http://imgsrc.baidu.com/forum/pic/item/c69ae2003af33a87ecb1c796c65c10385143b585.jpg"];
            
            //2.2        
            NSData *imageData = [NSData dataWithContentsOfURL:url];
            
            //2.3      
            self.image1 = [UIImage imageWithData:imageData];
        });
        
        //3.    ,    2
        dispatch_group_async(group, queue, ^{
            
              NSLog(@"DOWNLOAD2---%@",[NSThread currentThread]);
            //3.1   URL
            NSURL *url = [NSURL URLWithString:@"http://s6.sinaimg.cn/middle/6753066ftc67bdde1ca25&690"];
            
            //3.2        
            NSData *imageData = [NSData dataWithContentsOfURL:url];
            
            //3.3      
           self.image2 = [UIImage imageWithData:imageData];
        });
    
     dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            
            NSLog(@"COMBIE---%@",[NSThread currentThread]);
            
            //4.1        
            UIGraphicsBeginImageContext(CGSizeMake(200, 200));
            
            //4.2   1
            [self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];
            
            //4.3   2
            [self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];
            
            //4.4     
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            
            //4.5        
            UIGraphicsEndImageContext();
            
            //5.     ,       UI
           // dispatch_async(dispatch_get_main_queue(), ^{
                self.imageView.image = image;
                NSLog(@"UI---%@",[NSThread currentThread]);
            //});
        });