支持NSOperation的观点
回答者:BJ Homer
GCD
是C底层的API,它让一般的并行任务使用起来非常简单。NSOperation
和NSOperationQueue
是Object-C类,它们做的事情很相似。NSOperation
是第一个被介绍使用的。但是在mac10.6和iOS4,NSOperationQueue
底层用GCD
来实现了。
一般来说,你应该使用抽象等级最高的API来满足你的需求。这意味着你应该使用NSOperationQueue
来替代GCD
,除非你需要做一些NSOperaiontQueue
不支持的事情。
注意,NSOperationQueue
并不是GCD的简化版本。事实上,有许多事情你可以用NSOperationQueue
很简单的实现,它底层使用纯GCD
做了很多事情。(例如,当带宽被限制的时候,队列一次运行仅仅N(有你所控制的个数)个操作;在operations之间建立依赖关系。这些用NSOperation
实现非常简单,用GCD
就很复杂)Apple在GCD上做了很多工作,为了通过NSOpertaion
能够创建非常友好的API。尽可能的使用NSOperation
除非你有不得已的原因。
警告:另一方面,如果你真的需一个block,不需要NSOperationQueue
提供的任何方法,使用GCD没有什么不对的,只要确保这是你需要的。
NSOperation的优点:
- 抽象层级较高,对使用者友好
- 在带宽受限制的时候,限制任务的数量。
- 在Operation之间建立依赖
支持GCD的观点
回答者:Brad Larson
在这里有我对相关问题的回答。我不同意BJ的答案,并且建议你首选GCD而不是NSOperation/NSOperationQueue,除非后者提供了一些GCD不支持的功能。
在GCD之前,我使用了许多NSOperations/NSOperationQueues在我的Application来管理并行任务。但是自从我开始经常使用GCD,我基本上就用blocks和dispatch queues来替代NSOperations和NSOperationsQueues。原因来自我在实践中使用这两种技术、以及官方介绍中它们的执行方式。
首先,当使用NSOperaion和NSOperationQueue有很大的花费。这些是Cocoa objects,它们需要在heap上初始化和释放。在一个iOS application中。我写的东西在要渲染3-D场景在60FPS,我正使用NSOperation来包裹住渲染的frame。当我描绘这些的时候,在application运行的时候,创建和释放NSOperations占用CPU生命周期中很大一部分。这样会使一些东西运行缓慢。我用简单的block和GCD的同步队列来替代,这时候产生的负荷消失了,使渲染的性能有了更好的提升,不仅仅只有这个地方得到了优化。
其次,基于block的dispatch code很难和NSOperations配合使用。包裹一些code并把这些code,dispatch到被执行的串行和并发的队列是很方便的,在使用NSOperation或者NSInvocationOperation需要许多支持的code。我知道你可以使用NSBlockOperation,但是你也能dispatch一些东西到GCD。在application中,用相关处理过的inline block中包裹这些code。在我看来,code组织方式比分开方法或者自定义的包裹这些任务的NSOperation要好。
NSOperations和NSOperationQueues仍然有比较好的使用地方,GCD没有真正依赖的概念,NSOperationQueues能够设置相当复杂的依赖关系。我在这种case下使用NSOperationQueues。
综上所述,虽然我提倡使用较高抽象程度的API,但是在这种case下,我使用抽象程度较低的GCD。在iOS和Mac的开发者中,大部分都会选择GCD而不是NSOperations,除非OS或者iOS的版本不支持GCD。
GCD的优点:
- 降低CPU的开销,提升FPS
- 串行和并发的代码写起来很方便,减少些很多相同的代码,通过内连的方式把逻辑放在一起。
所以大家看需求各求所需
网友评论