没事,复习一下GCD相关知识。
1、
串行 任务顺序执行 DISPATCH_QUEUE_SERIAL
并行 多个任务同时执行,自动开启多个线程同时执行任务 DISPATCH_QUEUE_CONCURRENT
同步 在当前线程中执行任务,不具备开启新线程的能力
异步 在新的线程中执行任务,具备开启新线程的能力
2、
1>dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL);
例子: dispatch_get_main_queue实际为一个特殊的串行队列,顺序输出1,2,3,4
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"1");
});
dispatch_async(mainQueue, ^{
NSLog(@"2");
});
dispatch_async(mainQueue, ^{
NSLog(@"3");
});
dispatch_async(mainQueue, ^{
NSLog(@"4");
});
2》dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT);
例子:dispatch_get_global_queue 实际也为一个全局队列,打印顺序不固定,2,4,1,3dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
NSLog(@"1");
});
dispatch_async(defaultQueue, ^{
NSLog(@"2");
});
dispatch_async(defaultQueue, ^{
NSLog(@"3");
});
dispatch_async(defaultQueue, ^{
NSLog(@"4");
});3>单例中的运用dispatch_once
static dispatch_once_t onceToken;
4>延迟加载dispatch_after
dispatch_once(&onceToken, ^{
NSLog(@"onceToken");
});double delayInSeconds = 2.0;
5>调度组dispatch_group_t
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, mainQueue, ^{
NSLog(@"延时执行的2秒");
});dispatch_group_t group = dispatch_group_create();
以上代码也可以写成:
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, defaultQueue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"1");
});
dispatch_group_async(group, defaultQueue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"2");
});
dispatch_group_notify(group, defaultQueue, ^{
NSLog(@"3");
});dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(defaultQueue, ^{
NSLog(@"1");
dispatch_group_leave(group);
});6>dispatch_barrier_async在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行.dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-1"); }); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-2"); }); dispatch_barrier_async(concurrentQueue, ^(){ NSLog(@"dispatch-barrier"); }); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-3"); }); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-4"); });//这个函数可以设置同步执行的block,它会等到在它加入队列之前的block执行完毕后,才开始执行。在它之后加入队列的block,则等到这个block执行完毕后才开始执行。7>执行某个代码dispatch_apply 重复执行某个代码
//生成全局队列 6 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 7 8 9 /*! dispatch_apply函数说明 10 * 11 * @brief dispatch_apply函数是dispatch_sync函数和Dispatch Group的关联API 12 * 该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等到全部的处理执行结束 13 * 14 * @param 10 指定重复次数 指定10次 15 * @param queue 追加对象的Dispatch Queue 16 * @param index 带有参数的Block, index的作用是为了按执行的顺序区分各个Block 17 * 18 */ 19 dispatch_apply(10, queue, ^(size_t index) { 20 NSLog(@"%zu", index); 21 }); 22 NSLog(@"done"); 23 24 /*! 25 * @brief 输出结果 26 * 27 2016-02-25 19:24:39.102 dispatch_apply测试[2985:165004] 0 28 2016-02-25 19:24:39.102 dispatch_apply测试[2985:165086] 1 29 2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 4 30 2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 5 31 2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 6 32 2016-02-25 19:24:39.103 dispatch_apply测试[2985:165088] 3 33 2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 7 34 2016-02-25 19:24:39.105 dispatch_apply测试[2985:165004] 8 35 2016-02-25 19:24:39.105 dispatch_apply测试[2985:165004] 9 36 2016-02-25 19:24:39.102 dispatch_apply测试[2985:165087] 2 37 2016-02-25 19:24:39.105 dispatch_apply测试[2985:165004] done 38 * !!!因为在Global Dispatch Queue中执行,所以各个处理的执行时间不定 39 但done一定会输出在最后的位置,因为dispatch_apply函数会等待所以的处理结束 40 */