什么是GCD
Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。
除了代码的平行执行能力,GCD还提供高度集成的事件控制系统。可以设置句柄来响应文件描述符、mach ports(Mach port 用于 OS X上的进程间通讯)、进程、计时器、信号、用户生成事件。这些句柄通过GCD来并发执行。
GCD的API很大程度上基于block,当然,GCD也可以脱离block来使用,比如使用传统c机制提供函数指针和上下文指针。实践证明,当配合block使用时,GCD非常简单易用且能发挥其最大能力。
理解串行、并发及同步异步
串行和并发
串行和并发描述了任务之间执行的时机。任务如果是串行的,那么在同一时间只执行一个任务。并发的多个任务被执行的时候,可能是在同一时间。
同步和异步
同步和异步描述了一个函数相对于另一个函数何时执行完毕。同步的函数只有当它调用的任务执行完,才会返回。而异步函数,会立即返回。虽然它也命令任务执行完,但它并不等待任务执行完。如此,异步函数就不会阻塞当前线程。(这样说可能有些过于抽象了,个人理解的是,在同步的时候没有开启子线程的能力,而在异步的时候具备开启子线程的能力)。
队列
串行队列
1)使用dispatch_queue_create函数创建串行队列
dispatch_queue_t queue = dispatch_queue_create(“队列名”,NULL);
dispatch_queue_t queue = dispatch_queue_create(“队列名”,DISPATCH_QUEUE_SERIAL);
两者等效
2)使用主队列(在主队列中的任务,都会放到主线程中执行,它也是唯一一个允许更新UI的队列,所以要是开启子线程的时候要更新UI的情况下一定要用主队列进行更新)
dispatch_queue_t queue = dispatch_get_main_queue();
并发队列(GCD默认已经提供了全局的并发队列)
1)dispatch_queue_t queue = dispatch_get_global_queue(dispatch_queue_priority,unsigned long flags);
前一个参数是优先级,有以下几种:
DISPATCH_QUEUE_PRIORITY_HIGH 2//高
DISPATCH_QUEUE_PRIORITY_DEFAULT 0//默认
DISPATCH_QUEUE_PRIORITY_LOW (-2)//低
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MN//后台
2)dispatch_queue_t queue = dispatch_queue_create(“队列名”,DISPATCH_QUEUE_CONCURRENT);
在开发中基本上就是通过dispatch_async和dispatch_sync 分别配合着上面的三种队列使用,但是更多的情况下基本上就是dispatch_async和全局队列配合使用,并用主线程中更新UI。



