iOS-线程之GCD---之GCD的几种常用常用的方法

GCD中几种常见的方法

1.代码只被执行一次:(利用这种方式,可以简单的创建一个单例对象)

方法dispatch_once(&,^(void){});

 1 - (void)testOne
 2 
 3 {
 4 
 5     static dispatch_once_t onceToken;
 6 
 7     dispatch_once(&onceToken,^{
 8 
 9         NSLog(@"代码块只执行了一次");
10 
11     });
12 
13 }

2.在两个线程之间执行一段代码,并且分离了线程,不会使它们同时执行

方法:dispatch_barrier_async(queue,^(void){});

 1 - (void)testBarrier
 2 {
 3     //队列不能是系统的并行队列
 4     dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
 5     //线程一
 6     dispatch_async(concurrentQueue, ^{
 7         for (int i=0; i<100; i++) {
 8             NSLog(@"线程一:%d",i);
 9         }
10     });
11     //线程二
12     dispatch_async(concurrentQueue, ^{
13         for (int i=0; i<100; i++) {
14             NSLog(@"线程二:%d",i);
15         }
16     });
17     //在线程一,线程二执行完成之后,在线程三执行之前执行一段代码,再开始执行线程三
18     dispatch_barrier_async(concurrentQueue, ^{
19         NSLog(@"barrier");
20     });
21     
22     //线程三
23     dispatch_async(concurrentQueue, ^{
24         for (int i=0; i<100; i++) {
25             NSLog(@"线程三:%d",i);
26         }
27     });
28     //线程四
29     dispatch_async(concurrentQueue, ^{
30         for (int i=0; i<100; i++) {
31             NSLog(@"线程四:%d",i);
32         }
33     });
34 }

3.对此执行一段代码

方法:dispatch_apply(size_t t,queue,^(size_t times){});

block中的参数times是指当前执行的是队列中第几个线程,比如说:该方法要执行10次,就会在队列中创建10个线程,并且基本同时执行,times标识的就是当前第几个线程(所以times被打印是无序的).

 1 - (void)testApply
 2 {
 3     /*
 4      @param1 代码块执行的次数
 5      @param2 代码块所在的队列
 6      @param3 线程的执行体
 7      */
 8     size_t t = 10;
 9     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
10     
11     dispatch_apply(t, globalQueue, ^(size_t q){
12         NSLog(@"线程一:%ld",q);
13     });
14 }

4.代码在一段时间后执行

方法:dispatch_after(dispatch_time_t time,queue,^(void){});---time参数为当前时间的多少秒后去执行Block中的代码

 1 - (void)testAffter
 2 {
 3     NSLog(@"执行之前");
 4     //当前时间10秒之后
 5     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 10);
 6     /*
 7      @param1:时间
 8      @param2:线程所在的队列
 9      @param3:线程的执行体
10      */
11     dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
12         NSLog(@"执行了after");
13     });
14 }

5.GCD还提供了组的概念,可以将所有队列(线程放在队列中)放到组中

当组中所有队列中的线程执行完后,将会执行dispatch_group_notify(dispatch_group_t group,queue,^(void){});方法中Block

作用:当一个页面需要多个下载时候,就可以将该将所有异步下载的线程添加到队列后再添加到组中,当完成了所有的下载,最后在dispatch_group_notify方法中重新刷新页面.

 1 //将线程放到一个组里面
 2 - (void)testGroup
 3 {
 4     //创建一个组
 5     dispatch_group_t group = dispatch_group_create();
 6     
 7     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 8     /*
 9      @param1:线程所在的组
10      @param2:线程所在的队列
11      @param3:线程的执行体
12      */
13     dispatch_group_async(group, globalQueue, ^{
14         for (int i=0; i<100; i++) {
15             NSLog(@"线程一:%d",i);
16         }
17     });
18     //在组中在添加一个线程
19     dispatch_group_async(group, globalQueue, ^{
20         for (int i=0; i<100; i++) {
21             NSLog(@"线程二:%d",i);
22         }
23     });
24     
25     //在多有线程组里面的所有线程执行完成之后调用的代码
26     dispatch_group_notify(group, globalQueue, ^{
27         NSLog(@"线程所有的方法执行完成");
28     });
29 }

 

GCD如此强大,总有一款适合你..

原文地址:https://www.cnblogs.com/BeyondAverage0908/p/4713872.html