GCD是异步任务的技术之一,开发者只要将想要执行的任务添加到Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的。
1.创建DispatchQueue
创建单线程的queue:单线程的队列一次只能执行一个任务
dispatch_queue_t queueBase = dispatch_queue_create("com.cn.qxhomePage", DISPATCH_QUEUE_SERIAL);
创建多线程的queue:多线程队列中可以同时执行多个任务
dispatch_queue_t queueGlobal = dispatch_queue_create("com.cn.qxCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
2.GCD的内存管理
自动SDK6.0以后GCD已经支持ARC管理。所以不需要对queue进行手动内存管理。如果是非ARC那么就可以使用以下方法来对Queue进行管理
对queue对象引用计数起+1
dispatch_retain(queueBase);
对queue对象引用计数-1
dispatch_release(queueBase);
如果是ARC切SDK6.0以后就不要进行手动内存管理
3.系统标准提供的Dispatch Queue
Main Dispatch Queue/Global Dispatch Queue
获取主线程的方法
dispatch_queue_t serialQueue = dispatch_get_main_queue();
因为主线程只有一个。所以必然是串行队列。所有需要进行UI更新的操作都需要放到主线程中处理
dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
第一个参数是一个枚举。代表这个线程处理的优先级。第二个参数默认为0
串行队列和并行队列的任务执行结果如下
dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t serialQueue = dispatch_get_main_queue();
dispatch_async(currentQueue, ^{
NSLog(@"并行队列1");
});
dispatch_async(currentQueue, ^{
NSLog(@"并行队列2");
});
dispatch_async(currentQueue, ^{
NSLog(@"并行队列3");
});
dispatch_async(currentQueue, ^{
NSLog(@"并行队列4");
});
dispatch_async(currentQueue, ^{
NSLog(@"并行队列5");
});
dispatch_async(currentQueue, ^{
NSLog(@"并行队列6");
});
dispatch_async(currentQueue, ^{
NSLog(@"并行队列7");
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列1");
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列2");
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列3");
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列4");
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列5");
});
运行结果为
2018-01-09 00:05:48.353162+0800 Dispatch_queue[8431:310554] 并行队列1
2018-01-09 00:05:48.353257+0800 Dispatch_queue[8431:310556] 并行队列2
2018-01-09 00:05:48.354489+0800 Dispatch_queue[8431:310557] 并行队列5
2018-01-09 00:05:48.353961+0800 Dispatch_queue[8431:310554] 并行队列3
2018-01-09 00:05:48.354033+0800 Dispatch_queue[8431:310556] 并行队列4
2018-01-09 00:05:48.355329+0800 Dispatch_queue[8431:310562] 并行队列7
2018-01-09 00:05:48.354526+0800 Dispatch_queue[8431:310555] 并行队列6
2018-01-09 00:05:48.361822+0800 Dispatch_queue[8431:310451] 串行队列1
2018-01-09 00:05:48.362185+0800 Dispatch_queue[8431:310451] 串行队列2
2018-01-09 00:05:48.364785+0800 Dispatch_queue[8431:310451] 串行队列3
2018-01-09 00:05:48.365115+0800 Dispatch_queue[8431:310451] 串行队列4
2018-01-09 00:05:48.365582+0800 Dispatch_queue[8431:310451] 串行队列5
结果分析为:串行队列任务都是按照顺序执行的。每次都只能执行一个任务。
并行队列因为可以同时执行多个任务。所以执行任务顺序不一定。有可能先被加入队列的任务执行的晚于后加入队列的任务。
4.dispatch_set_target_queue
使用示例如下:
dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t queueT = dispatch_queue_create("baseQueue", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(queueT, currentQueue);
使用分析、使用set_target_queue方法可以将第一个参数的的任务执行优先级设置为第二个参数的优先级。相示例这样就将queueT的执行优先级设置为了DISPATCH_QUEUE_PRIORITY_HIGH。如果多个串行队列都调用set_target_queue方法设置一个串行队列A为执行队列。那么本来相互并行执行的串行队列,在队列A上执行任务的这些任务只能同时执行一个处理??梢杂迷谀承┣榭鱿碌氖菪慈氲幕コ獾取?/p>