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如此强大,总有一款适合你..
内容原创-可转载-请保留原地址