GCD(Grand Central Dispatch)是基于C语言的底层API
使用BLOCK块定义任务作为队列中的操作
操作会被放入FIFO队列
队列负责调度BLOCK块的执行
一、三种队列类型
1、主队列main queue、全局调度队列global dispatch queue(包括四种优先级)、自定义队列
(1)系统主队列-串行执行
dispatch_queue_t queue =dispatch_get_main_queue();
(2)全局调度队列-高优先级、并行执行
dispatch_queue_t hightQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
(3)全局调度队列-默认优先级、并行执行
dispatch_queue_t defaultQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
(4)全局调度队列-低优先级、并行执行
dispatch_queue_t lowQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);
(5)全局调度队列-后台、并行执行
dispatch_queue_t backgroundQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
(6)自定义队列-串行执行
dispatch_queue_t serialQueue =dispatch_queue_create("MySerialQueue",DISPATCH_QUEUE_SERIAL);
(7)自定义队列-并行执行
dispatch_queue_t concurrentQueue =dispatch_queue_create("MyConcurrentQueue",DISPATCH_QUEUE_CONCURRENT);
二、串行与并发
1、串行队列serial queue:队列中的BLOCK只能按照添加的顺序FIFO一个执行完再执行下一个
2、并发队列concurrent queue:队列中的BLOCK按照添加的顺序FIFO开始任务,开始后的BLOCK可以同时执行,可能以任意顺序完成BLOCK。
主队列为串行队列,全局调度队列为并发队列,自定义队列可以指定串行或并发。
并发与并行的区别:并发是宏观上同时进行,微观上非同时进行,比如单核CUP上时间片轮流执行;并行是宏观与微观上都同时进行,比如多核CPU上不同的核上同时执行。
三、同步与异步
1、同步Synchronous:同步函数在函数执行结束后才返回
dispatch_sync(backgroundQueue, ^{
NSLog(@"这个BLOCK先执行完成");
});
dispatch_sync(backgroundQueue, ^{
NSLog(@"这个BLOCK后执行完成");
});
2、异步Asynchronous:异步函数在开始执行后立即返回,而不等待函数执行完成
dispatch_async(backgroundQueue, ^{
NSLog(@"这个BLOCK先开始执行,执行完成的顺序不确定");
});
dispatch_async(backgroundQueue, ^{
NSLog(@"这个BLOCK后开始执行,执行完成的顺序不确定");
});
3、延迟Delay:在指定队列上延迟指定时间后开始执行BLOCK
double delayInSeconds =2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);
dispatch_after(popTime,dispatch_get_main_queue(), ^{
NSLog(@"在主队列上延迟2秒后开始执行BLOCK");
});
4、一次性Once:指定标识的BLOCK只会被执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"不管这个标识为onceToken的BLOCK被提交多少次,只会执行一次");
});
四、分发组:实现多个BLOCK并发执行,全部执行完成后汇总结果
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, defaultQueue, ^{
NSLog(@"BLOCK1先开始执行");
});
dispatch_group_async(group, defaultQueue, ^{
NSLog(@"BLOCK2后开始执行");
});
dispatch_group_notify(group, backgroundQueue, ^{
NSLog(@"BLOCK1和BLOCK2全部执行完毕后,才执行这里");
});
附: