# 43、掌握GCD及操作队列的使用时机

开发者可以把操作以`NSOperation`子类的形式放在队列中，而这些操作也能后并发执行。虽说“操作队列”（operation queue）在GCD之前就有了，其中某些设计原理因操作队列而流行，GCD就是基于这些原理构建的。实际上，从iOS4与Mac OS10.6开始，操作队列在底层是用GCD来实现的。

​ GCD是纯C的API，而操作队列这是OC的对象；在GCD中，任务用块来表示，而块时一个轻量级数据结构，而“操作”（operation）则是个更为重量级的OC对象。

​ 使用`NSOperation`及`NSOperationQueue`的好处：

* 取消某个操作。已经启动的任务无法取消（GCD队列的任务就无法取消）
* 指定操作间的依赖关系。
* 通过键值观察机制监控`NSOperation`对象的属性。`isCancelled`、`isFinished`...
* 指定操作的优先级。此操作与队列中其他操作之间的优先关系（GCD队列确实有优先级，不过那是针对整个队列的不是针对每个块的）
* 重用NSOperation对象。可以继承该类，存放任何信息。对象在执行时可以充分利用继承而来的各种信息，还可以随意调用其方法。

​ 操作队列有很多地方胜过派发队列：操作队列提供了多种执行任务的方式，而且都是写好的，直接就能使用。开发者不用再编写复杂的调度器，也不用自己来实现取消操作或指定操作优先级的功能，这些事情操作队列都已经实现好了。

要点：

* 在解决多线程与任务管理问题时，派发队列并非唯一方案
* 操作队列提供了一套高层的OC API，能实现纯GCD所具备的绝大部分功能，而且还能完成一些更为复杂的操作，那些操作若改用GCD来实现，则需另外编写代码
