本条要点:(做者总结)算法
GCD 技术确实很棒,不过有时侯采用标准系统库的组件,效果会更好。必定要了解每项技巧的使用时机,若是选错了工具,那么编出来的代码就会难于维护。服务器
不多有其余技术能与GCD 的同步机制相媲美。对于那些只须要执行一次的代码来讲,也是如此,使用 GCD 的 dispatch_once 最为方便。然而,在执行后台任务时,GCD 并不必定是最佳方式。还有一种技术叫作 NSOperationQueue,它虽然与 GCD 不一样,可是却与之相关,开发者能够把操做以 NSOperation 子类的形式放在队列中,而这些操做也可以并发执行。其与 GCD 派发队列有类似之处,这并不是巧合。“操做队列”(operation Queue)在 GCD 以前就有了,其中某些设计原理因操做队列而流行,GCD 就是基于这些原理构建的。实际上,从 iOS 4 与 Mac OSX 10.6 开始,操做队列在底层是用 GCD 来实现的。数据结构
在二者的诸多差异中,首先要注意:GCD 是纯 C 的 API,而操做队列则是 Objective-C 的对象。在 GCD 中,任务用块来表示,而块是个轻量级数据结构。与之相反,“操做”(operation)则是个更为重量级的 Objective-C 对象。虽然说如此,但 GCD 并不老是最佳方案。有时候采用对象所带来的开销微乎其微,使用完整对象所带来的好处反而大大超过其缺点。多线程
用 NSOperationQueue 类的 “addOperationWithBlock:” 方法搭配 NSBlockOperation 类来使用操做队列,其语法与纯 GCD 方式很是相似。使用 NSOperation 及 NSOperationQueue 的好处以下:架构
正如你们所见,操做队列有不少地方赛过派发队列。操做队列提供了多种执行任务的方式,并且都是写好了的,直接就能使用。开发者不用再编写复杂的调度器,也不用本身来实现取消操做或指定操做优先级的功能,这些事情操做队列都已经实现好了。并发
有一个 API 选用了操做队列而非派发队列,这就是 NSNotificationCenter ,开发者可经过其中的方法来注册监听器,以便在发生相关事件时获得通知,而这个方法接受的参数是块,不是选择子。方法原型以下:工具
1 - (id)addObserverForName:(NSString *)name object:(id)object queue:(NSOperationQueue *)queue usingBlock:(void(^)(NSNotification *))block;
原本这个方法也能够不使用操做队列,而是把处理通知事件所用的块安排在派发队列里。但实际上并无这么作,其设计者显然使用了高层的 Objective-C API。在这种状况下,两套方案的运行效率没多大差距。设计这个方法的人可能不想使用派发队列,由于那样将依赖于 GCD,而这种依赖没有必要,前面说过,块自己和 GCD 无关,因此若是仅使用块的话,就不会引入对 GCD 的依赖了。也有可能编写这个方法的人想所有用 Objective-C 来描述,而不想使用纯 C 的东西。性能
常常会有人说:应该尽量选用高层 API,只在确有必要时才求助于底层。笔者也赞成这个说法,但我并不盲从。某些功能确实能够用高层的 Objective-C 方法来作,但这并不等于说它就必定比底层实现方案好。要想肯定哪一种方案更佳,最好仍是要测试一下性能。测试
ENDspa