GCD的使用简单总结

作者: 浮桥小麦 | 来源:发表于2016-07-27 10:53 被阅读45次

    GCD的知识技能点截图:

    Snip20160727_1.png
    知识点逐一简介
    NO.1 GCD同步函数+串行队列(所有的都写为一个小方法,调用就好)
    -(void)syncSerial
    {
      //1.创建串行队列  
    #"45":队列标签可以随便命名,但最好还是和自己要执行的任务有关(见名知意)
    #DISPATCH_QUEUE_SERIAL:表示为串行队列的宏
     dispatch_queue_t queue = dispatch_queue_create("45", DISPATCH_QUEUE_SERIAL);
     //2.封装任务(其实就是把自己要执行的任务放入创建好的队列中)
     #  dispatch_sync:为同步函数,不具备开线程能力     
     dispatch_sync(queue, ^{
            //打印一句话和当前线程()
            NSLog(@"演员1-----%@",[NSThread currentThread]);
       });
        dispatch_sync(queue, ^{
           NSLog(@"演员2-----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
           NSLog(@"演员3-----%@",[NSThread currentThread]);
        });
    }
    #注:这样执行的三个任务都在主线程中执行且是串行执行的(即依次进行)
    
    
    NO.2 GCD同步函数+并行队列
    -(void)syncConcurrent
    {
    //1.创建队列(这个队列是自己创建的)
    #DISPATCH_QUEUE_CONCURRENT:并发队列的宏
        dispatch_queue_t  queue = dispatch_queue_create( "126", DISPATCH_QUEUE_CONCURRENT);
    
     //2.封装任务
        dispatch_sync(queue, ^{
            //打印一句话和当前线程
          NSLog(@"演员1-----%@",[NSThread currentThread]);
       });
        dispatch_sync(queue, ^{
        NSLog(@"演员2-----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"演员3-----%@",[NSThread currentThread]);
       });
    
    }
    #注:不会开辟线程,在主线程中执行任务,任务是串行执行的
    #获得系统的全局并发队列
     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    #DISPATCH_QUEUE_PRIORITY_DEFAULT:队列优先级的宏
    
    NO.3 GCD异步函数+串行队列
    -(void)asyncSerial
    {
     //1.创建串行队列
        dispatch_queue_t queue = dispatch_queue_create("12345", DISPATCH_QUEUE_SERIAL);
     //2.封装任务(异步函数)
    # dispatch_async:异步函数具备开线程的能力 
        dispatch_async(queue, ^{
       //打印一句话和当前线程(打印出来number = 2,是在子线程中执行的)
       NSLog(@"丑八怪啊-1-----%@",[NSThread currentThread]);
     });
      dispatch_async(queue, ^{
         NSLog(@"丑八怪啊-2-----%@",[NSThread currentThread]);
       });
    dispatch_async(queue, ^{
          NSLog(@"丑八怪啊-3-----%@",[NSThread currentThread]);
       });
    }
    #注:会开线程,开一条线程,队列中的任务是依次执行的
    
    
    
    NO.4 GCD异步函数+并发队列
    -(void)asyncConcurrent
    {
      //1.创建并发队列
    dispatch_queue_t  queue = dispatch_queue_create( "123456", DISPATCH_QUEUE_CONCURRENT);
    //2.封装任务(异步函数)
     dispatch_async(queue, ^{
        //打印一句话和当前线程
            NSLog(@"我爱你1-----%@",[NSThread currentThread]);
      });
    dispatch_async(queue, ^{
          NSLog(@"我爱你2-----%@",[NSThread currentThread]);
        });
      dispatch_async(queue, ^{
          NSLog(@"我爱你3-----%@",[NSThread currentThread]);
       });
    #注:会开启多条线程,队列中的任务是并发执行的
    }
    
    NO.5 GCD同步函数+主队列
    -(void)syncMainQueue
    {
       //1.获得主队列
        dispatch_queue_t queue = dispatch_get_main_queue();
       //2.封装任务
        dispatch_sync(queue, ^{
            //打印一句话和当前线程()
            NSLog(@"演员1-----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
           NSLog(@"演员2-----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"演员3-----%@",[NSThread currentThread]);
         });
    }
    #注:在主线程中执行,不会开线程
    
    NO.6 GCD异步函数+主队列
    -(void)asyncMainQueue
    {
       //1.获得主队列
        dispatch_queue_t queue = dispatch_get_main_queue();
        //2.封装任务
        dispatch_async(queue, ^{
            //打印一句话和当前线程()
            NSLog(@"演员1-----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
          NSLog(@"演员2-----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
         NSLog(@"演员3-----%@",[NSThread currentThread]);
        });
    }
    #注:所有任务都在主线程中执行,不会开线程
    
    

    GCD的常用函数

    NO.1 延迟函数
    //1.点击屏幕调用GCD方法
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //GCD里面的延迟方法
        [self delay];
    }   
    //GCD里面的延迟方法
    -(void)delay
    {
    //获得全局并发队列  
     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //GCD延迟函数 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
           [self task];
        });
    
    }
    //提供一个延迟调用的方法
    -(void)task
    {
     NSLog(@"我爱你---%@",[NSThread currentThread]);
    }
    
    
    NO.2 栅栏函数
    #注:栅栏函数不能用在全局并发队列中,只能自己创建并发队列
    //点击屏幕触发方法
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
    //1.创建并发队列
     dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
    //2.异步函数
     //异步函数
        dispatch_async(queue, ^{
           NSLog(@"丑八怪1---%@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"丑八怪2---%@",[NSThread currentThread]);
        });
      #实现需求:我们在1,2都执行完,才执行3(就可以用栅栏函数,拦截一下)
        dispatch_barrier_async(queue, ^{
            NSLog(@"------------------------------");
        });
       dispatch_async(queue, ^{
             NSLog(@"丑八怪3---%@",[NSThread currentThread]);
        });
    }
    #注:栅栏函数用来控制并发队列中的执行顺序
    

    GCD线程间的通信

    //点击屏幕下载一张图片(准备工作:在stroyboard拖一个UIImageView出来,把属性拖出来)
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
       #下载图片是一个耗时操作,我们放在子线程中去执行
       #创建子线程下载图片,用GCD的异步函数(这里只有一个任务用串行和并发的都行)
          dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);//并发队列
    
     //这段代码是在子线程中执行的
        dispatch_async(queue, ^{
          //下载图片
        //1.确定url
            NSURL *url = [NSURL URLWithString:@"http://img2.3lian.com/2014/f4/51/d/13.jpg"];
        //1.2 下载二进制数据到本地
       NSData *imageData = [NSData dataWithContentsOfURL:url];
          //1.3 将二进制数据转换为图片
            UIImage *image = [UIImage imageWithData:imageData];
    //打印一下当前线程        
      NSLog(@"--%@",[NSThread currentThread]);
         # 现在图片有了,需要更新UI,就得回到主线程中
            dispatch_async(dispatch_get_main_queue(), ^{
                self.imageView.image = image;
            NSLog(@"***%@",[NSThread currentThread]);
            });
         });
      }
    }
    #GCD中的线程通信函数是可以嵌套的
    
    后记:GCD主要用法大概总结了一下,还有些用法可以根据Xmind技能图自行补充

    相关文章

      网友评论

        本文标题:GCD的使用简单总结

        本文链接:https://www.haomeiwen.com/subject/tglojttx.html