引言:
GCD的全称是Grand Central Dispatch,是苹果在iOS4.0发布的一套处理并发运算方面的API.其用途是为了提高处理器多核运算的能力.
GCD有点像NSOperationQueue,它们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行,但GCD比之NSOpertionQueue更底层更高效。
GCD的工作原理:
GCD的工作原理是让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行.
参考资料:
1:Blocks与Dispatch Queue的使用
http://liwpk.blog.163.com/blog/static/363261702012413103111749/
2:使用GCD
http://blog.devtang.com/blog/2012/02/22/use-gcd/
3:GCD(Grand Central Dispatch)教程
http://www.dreamingwish.com/dream-2012/gcdgrand-central-dispatch%E6%95%99%E7%A8%8B.html
4:iOS中的GCD多线程模型
http://www.cnblogs.com/astin/archive/2012/08/02/2619752.html
5:iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
http://blog.csdn.net/totogo2010/article/details/8016129
使用:
使用GCD的好处和注意事项:
1.通过使用GCD可以高效的利用处理器多核运算的能力
2.繁杂好时较长的计算任务可以通过GCD分配给其他线程来完成任务.
3.如果没有特殊需求,不应引入线程增加程序复杂度
4.谨慎对待线程阻塞.
理解Dispatch Queue(调度列队):
Dispatch Queue分为下面三种:
Serial Queue(串行队列):
Serial Queue它们各自是同步执行的(一般很少用到)
Concurrent Queue(并行队列):
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
Main queue(主队列):
它是全局可用的serial queue,它是在应用程序主线程上执行任务的。UI层面的更新都必须通过主线程来执行,否则会出现很多无法预估的问题.
GCD的API介绍和使用场景:
dispatch_barrier_async
通过barrier分配的任务可以保证同一队列之前传进任务执行完毕以后,在执行由barrier分配的任务,当由barrier分配的任务也执行完成时,才会继续执行下一个任务.
示例代码如下:
dispatch_queue_t queue = dispatch_queue_create("wwww", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:0.2]; NSLog(@"task 1"); }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:0.2]; NSLog(@"task 2"); }); dispatch_barrier_async(queue, ^{ NSLog(@"等 task1 ,task2 执行完成以后 我才会执行"); [NSThread sleepForTimeInterval:0.2]; }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:0.2]; NSLog(@"因为在被分配时是在 barrier task 后面, 所以我会等 barrier任务执行完成我才会执行"); }); dispatch_release(queue);
2013-05-29 14:30:47.677 GCDDemo[4630:1b03] task 2
2013-05-29 14:30:47.677 GCDDemo[4630:1303] task 1
2013-05-29 14:30:47.679 GCDDemo[4630:1303] 等 task1 ,task2 执行完成以后 我才会执行
2013-05-29 14:30:48.082 GCDDemo[4630:1303] 因为在被分配时是在 barrier task 后面, 所以我会等 barrier任务执行完成我才会执行
注:必须保证是在同一个队列中才会按序执行任务,如果同时存在多个队列中,将没有效果.
多队列中的有序执行,需要用semaphore以等待,允许的方式来安排有序调度任务. 下面进入semaphore!
GCD的内存管理:
GCD的内存管理通过dispatch_retain和dispatch_release来控制变量的保留和释放.
不过在iOS 6以后 GCD内存管理可以完全交给ARC来负责.
如果你的项目需要iOS5.0,那么还是需要进行手动管理.
更多信息请参考下面的stackoverflow一问
http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues