1.什么是GCD?
GCD (Grand Central Dispatch) 是异步执行任务的技术之一,以非常简洁的语法实现了复杂繁琐的多线程编程。
使用GCD的语法如下:
dispatch_async(queue, ^{
//在后台 执行耗时的操作处理,处理完毕后调用主线程更新用户界面
dispatch_async(dispatch_get_main_queue(), ^{
//主线程同步,例如更新用户界面
});
});
2.Dispatch_Queue
GCD中有2种类型队列,Serial Dispatch Queue 和 ConcurrentDispatch Queue。
1) Serial Dispatch Queue
串行队列,按照任务顺序执行处理,在同一时间执行一个任务,如下图:
Serial Dispatch Queue 不使用锁,可以解决多线程中 “数据竞争”的问题,如下图:
iOS 中的UI主线程队列 是Serial Dispatch Queue 类型,创建一个Serial Dispatch Queue时,系统会为此队列创建一个线程,比如创建5个Serial Dispatch Queue此时系统就会创建5个线程,过多的创建会消耗大量内存,引起大量上下文切换,大幅降低系统相应性能。
2) Concurrent Dispatch Queue
并行队列,队列中执行的任务顺序是不固定的,如下图:
Concurrent Disaptch Queue 使用XNU内核来管理线程,不会发生Serial Dispatch Queue的问题。如果操作中不存在"数据竞争" 问题,请使用Concurrent Dispatch Queue。
3.创建队列
1) 使用dispatch_queue_create
创建Serial Dispatch Queue
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("queue identity", nil);
创建Concurrent Dispatch Queue
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("queue identity", DISPATCH_QUEUE_CONCURRENT);
参数1 :队列的标示(建议identity定义的规范,在输出错误日志调试时非常有用)
参数2: 队列类型,nil 代表 Serial 队列 , DISPATCH_QUEUE_CONCURRENT代表 Concurrent 队列
*具体信息可查阅苹果官方的帮助文档
2) 使用系统标准提供的 Dispatch Queue 来创建
dispatch_get_global_queue()
dispatch_get_main_queue()