线程与网络-①线程GCD
–
知识架构
## 六、GCD > [< 返回目录](#目录)0、dispatch_sync、dispatch_async
1.GCD中有2个用来执行任务的函数
说明:把右边的参数(任务)提交给左边的参数(队列)进行执行。
(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
以下参考自:dispatch_group_async 使用详解
1、dispatch_group_async (可实现队列同步)
要实现监听一组任务是否全部完成,等到全部完成后执行其他的操作可以使用dispatch_group_async(这个方法很有用)。比如异步下载多张图片,等所有图片下载完成之后,再去做一些事情(比如才通知界面说完成的)。
如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,我们只需把该操作放到最后一个任务来执行就可以,但是在并行队列中怎么做呢。答案是用dispatch_group任务组来做。
思路:创建一个任务组,然后将异步操作都放进任务组里面,在最后用notify 告知所有任务完成,并做相应处理,一般最后的处理都是在主线程里面刷新UI来提示用户。
1 | dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //创建并行队列queue |
附:下面的两种调用其实是等价的,
1 | A) |
其他:
2、dispatch_barrier_async(可实现队列同步)
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
1 | dispatch_queue_t queue = dispatch_queue_create("**test.abc.queue", DISPATCH_QUEUE_CONCURRENT); |
3、dispatch_apply
dispatch_apply执行某个代码片段N次。
1 | dispatch_apply(5, globalQ, ^(size_t index) { |
4、小结dispatch_group_async、dispatch_barrier_async、dispatch_apply分别是什么?
dispatch_group_async 可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行dispatch_apply 执行某个代码片段N次。
5、GCD四大队列
(1)、串行队列
(2)、并发队列
(3)、全局队列
全局队列:
和并发队列,执行效果一样,只是说,并发队列,需要我们程序员,自己创建
而全局队列,是由于系统提供