本文是来自@FlyOceanFish的投稿
Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。
Dispatch Queue将想执行的任务追加到适当的Dispatch QueueDispatch Queue种类说明Serial Dispatch Queue串行队列,任务按照追加顺序处理(FIFO)
Concurrent Dispatch Queue并行队列
串行队列
并行队列
重点
串行队列只有一个线程,并行队列有多个线程。
自建Queuedispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);//创建了一个并行队列 dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_SERIAL);//创建了一个串行队列
系统QueueMain DispatchQueue 在主线程中执行的Dispatch Queue。因为主线程只有1个,所以Main Dispatch Queue是串行队列。加入到主队列中的任务一定不会生成新的线程,因为主队列必须有且只有一条主线程。
Global Dispatch Queue 一个所有应用程序都能够使用的并发队列。加入到该队列中的任务不一定会生成线程。因为有线程重用的现象
iOS8.0之后的权限名称描述QOS_CLASS_USER_INTERACTIVE与用户交互的任务,这些任务通常跟UI级别的刷新相关,比如动画,这些任务需要在一瞬间完成
QOS_CLASS_USER_INITIATED由用户发起的并且需要立即得到结果的任务,比如滑动scroll view时去加载数据用于后续cell的显示,这些任务通常跟后续的用户交互相关,在几秒或者更短的时间内完成
QOS_CLASS_DEFAULT优先级介于user-initiated 和 utility,当没有 QoS信息时默认使用,开发者不应该使用这个值来设置自己的任务
QOS_CLASS_UTILITY一些可能需要花点时间的任务,这些任务不需要马上返回结果,比如下载的任务,这些任务可能花费几秒或者几分钟的时间
QOS_CLASS_BACKGROUND这些任务对用户不可见,比如后台进行备份的操作,这些任务可能需要较长的时间,几分钟甚至几个小时
QOS_CLASS_UNSPECIFIED未指定
Dispatch Group
dispatch_group是GCD的一项特性,能够把任务分组。调用者可以等待这组任务执行完毕,也可以提供回调函数之后继续往下执行,这组任务完成时,调用者会得到通知。常用场景比如说,下载一个大的文件,分块下载,全部下载完成后再合成一个文件。再比如同时下载多个图片,监听全部下载完后的动作创建groupdispatch_group_t group = dispatch_group_create();添加任务dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);
将一个任务添加到指定group中
dispatch_group_enter(dispatch_group_t group); dispatch_group_leave(dispatch_group_t group);
这两个函数同上边一样的效果,不过一定要注意这两个函数必须成对出现!否则这一组任务就永远执行不完。
监听任务完成
timeout参数表示