iOS应用程序的操作队列与调度队列

  1. Operation Queue和Dispatch Queue有什么区别?
  2. 在什么情况下使用它们会更合适?

NSOperationQueue早于Grand Central Dispatch,在iOS上它不使用GCD来执行操作(这在Mac OS X上是不同的)。 它使用比GCD调度队列多一点的定期后台线程。

另一方面, NSOperationQueue给你更多的控制你的操作是如何执行的。 您可以定义各个操作之间的依赖关系,例如,对于普通的GCD队列而言这是不可能的。 也可以取消已经在NSOperationQueueNSOperationQueue的操作(只要操作支持它)。 当你将一个块排入GCD调度队列时,它肯定会在某个时刻执行。

综上所述, NSOperationQueue可以更适合长时间运行的操作,这些操作可能需要被取消或者具有复杂的依赖关系。 GCD调度队列对于应该具有最小性能和内存开销的短任务是更好的。

编辑 :看来关于NSOperationQueue的文档是过时的,它确实在iOS 4.0和更高版本上使用GCD。

  • 首选GCD,其任务并不复杂,需要最佳的CPU性能
  • 首选NSOperationQueue,其任务非常复杂,需要取消或挂起块和依赖关系pipe理

GCD是一种轻量级的方式来表示要同时执行的工作单元。 你不安排这些工作单位; 系统会为您安排时间安排。 在块之间添加依赖可能是一个头痛的问题。 取消或暂停一个块为开发者创造额外的工作!

NSOperation和NSOperationQueue相比GCD增加了一些额外的开销,但是您可以在各种操作之间添加依赖关系。 您可以重新使用操作,取消或暂停操作。 NSOperation与Key-Value Observation(KVO)兼容; 例如,您可以通过侦听NSNotificationCenter来启动NSOperation。

有关详细的解释,请参阅此问题:https://stackoverflow.com/questions/10373331/nsoperation-vs-grand-central-dispatch