GCD简介
image这是Apple给出的官方解释,大体意思就是:Grand Central Dispatch(GCD) 是Apple开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。
提到队列,我们就会想到2中队列,串行队列(Serial Diapatch Queue)和并行队列(Concurrent Diapatch Queue)
-
串行队列(Serial Diapatch Queue)
使用场景:当任务相互依赖,具有明显的先后顺序的时候,使用串行队列是一个不错的选择。
创建方法:
image
参数说明:第一个参数为队列名称,第二个为参数类型
调用,再第二次调用中我们休眠2秒,再第三次调用中我们休眠1秒
image
为了能更好的理解,在调用的过程中添加了log,看一下日志平台的log
image
我们能看到,sitech=3的输出是再sitech=2的输出之后,也就是说,sitech=3是在等待sitech=2执行完成之后再执行的。 -
Concurrent Diapatch Queue 并发队列
与串行队列刚好相反,他不会存在任务间的相互依赖。
创建方法:比较2个队列的创建,我们发现只有第二个参数从DISPATCH_QUEUE_SERIAL变成了对应的DISPATCH_QUEUE_CONCURRENT,其他完全一样。
image
用同一段代码,换一种队列我们来比较一下效果:
image
输出的log:
image
我们发现,log的输出在3个不同编号的线程中进行,而且相互不依赖,不阻塞。
其实系统为我们提供了2个队列:Global Queue & Main Queue
Global Queue其实就是系统创建的Concurrent Diapatch Queue
Main Queue 其实就是系统创建的位于主线程的Serial Diapatch Queue
通常我们会把2个队列放到一起使用,也是我们最常用的开异步线程-执行异步任务-回主线程的一种方式。
image
下面我们来说一下对队列的操作方法
1、dispatch_after
延迟执行的方法,因为再主线程中不能休眠来延迟执行调用
image
日志
image
从日志中我们能看到,再延迟了3秒之后才输出的执行了方法日志。
2、dispatch_group
当我们需要监听一个并发队列中,等到所有任务都执行完成了之后,再继续往下执行,就得用到这个group,因为并发队列你并不知道哪一个是最后执行的,所以以单独一个任务是无法监听到这个点的,如果把这些单任务都放到同一个group,那么,我们就能通过dispatch_group_notify方法知道什么时候这些任务全部执行完成了。
image
日志输出:
image
我们能看到等着任务都完成之后,才输出的group finish
3、dispatch_once
这个函数一般是用来做一个真的单例,也是很常用的。
image
网友评论