GCD详细用法

一、延迟执行
1.介绍
第一种方法,该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。

[self performSelector:@selector(run) withObject:nil afterDelay:3.0];

说明:在3秒钟之后,执行run函数

 

第二种方法,什么时间,执行这个队列中的这个任务。如果队列是主队列,那么就在主线程执行,如果队列是并发队列,那么会新开启一个线程,

                     在子线程中执行。

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

       //延迟执行的方法

    });

说明:在5秒钟之后,执行block中的代码段。

参数说明:

 

二、一次性代码

1、使用dispatch_once创建一次性代码,整个程序运行过程中,只会执行一次

     使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次

     static dispatch_once_t onceToken;

     dispatch_once(&onceToken, ^{

         // 只执行1次的代码(这里面默认是线程安全的)

     });

  

三、基本用法

1、主队列(串行队列):是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。

      提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程。

获取主队列的方式:

 dispatch_queue_t queue=dispatch_get_main_queue();

(1)使用异步函数执行主队列中得任务:

     dispatch_async(queue, ^{

           NSLog(@"使用异步函数执行主队列中的任务1--%@",[NSThread currentThread]);

       }); 

(2)使用同步函数,在主线程中执行主队列中得任务,会发生死循环,任务无法往下执行。所以禁止在主线程中执行同步函数,示意图如下:

 

  

2、全局队列(并发队列)  GCD在每个应用程序都一个全局队列,所以不需要创建并发队列,可以直接使用

      提示:同步函数不会新建线程,异步执行可能会新建N条线程
 

获取一个全局串行队列 

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 30//2.把任务添加到队列中执行31
(1) 异步执行
        dispatch_async(queue, ^{
       异步执行的代  });
 
(2)同步执行
          dispatch_sync(queue, ^{
       NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);    });
 
2、新建队列(串行队列)
      提示:同步函数不会新建线程,异步执行会新建1条线程,需要执行的异步代码放在新建的子线程,但是任然会串行执行
 
 

新建串行队列

      dispatch_queue_t queue = dispatch_queue_create("zhufeidong", NULL); // 创建串行队列

      dispatch_release(queue);             // 非ARC需要释放手动创建的队列

(1) 异步执行
        dispatch_async(queue, ^{
       异步执行的代  });
 
(2)同步执行
          dispatch_sync(queue, ^{
       NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);    });
 
2、队列组

步骤:

(1)创建一个组:dispatch_group_t group =  dispatch_group_create();

(2)任务1:dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                                                                // 执行1个耗时的异步操作

                         });

(3)任务2:dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                                                 // 执行1个耗时的异步操作

                        });

(4)执行完毕之后:dispatch_group_notify(group, dispatch_get_main_queue(), ^{

                                               // 等前面的异步操作都执行完毕后,回到主线程...

                         });

 
原文地址:https://www.cnblogs.com/hepingqingfeng/p/5457682.html