NSOperation与大中央调度
我正在学习iOS的并发编程。 到目前为止,我已经读过NSOperation
/ NSOperationQueue
和GCD
。 使用NSOperationQueue
不是GCD
的原因是什么?反之亦然?
听起来像GCD
和NSOperationQueue
抽象出用户明确创建的NSThreads
。 然而,这两种方法之间的关系并不清楚,所以任何反馈意见,以赞赏!
GCD
是一个基于C的低级API,可以非常简单地使用基于任务的并发模型。 NSOperation
和NSOperationQueue
是做类似事情的Objective-C类。 NSOperation
介绍了NSOperation
,但是从10.6和iOS 4开始, NSOperationQueue
和朋友们都是使用GCD
在内部实施的。
一般来说,您应该使用适合您需求的最高抽象级别。 这意味着您通常应该使用NSOperationQueue
而不是GCD
,除非您需要执行NSOperationQueue
不支持的操作。
请注意, NSOperationQueue
不是GCD的“ NSOperationQueue
”版本; 事实上,使用NSOperationQueue
可以很简单地完成很多事情,而这些都需要使用纯粹的GCD
进行很多工作。 (例如:带宽限制队列,只有一次运行个运算;建立业务之间的依赖关系都非常简单, NSOperation
,很难与GCD
。)苹果公司做了充分利用GCD的拼搏,创造出一个非常好的对象友好API与NSOperation
。 除非你有理由不这样做,否则请利用他们的工作。
警告 :另一方面,如果你真的需要发送一个块,并且不需要NSOperationQueue
提供的任何附加功能, NSOperationQueue
使用GCD没有任何问题。 只要确保它是这项工作的正确工具。
根据我对相关问题的回答,我会不同意BJ,并建议你先看看GCD而不是NSOperation / NSOperationQueue,除非后者提供了GCD不需要的东西。
在GCD之前,我在我的应用程序中使用了很多NSOperations / NSOperationQue来管理并发。 然而,自从我开始定期使用GCD之后,我几乎完全用块和派遣队列取代了NSOperations和NSOperationQueue。 这来自我在实践中使用这两种技术的方式,以及我在其中进行的分析。
首先,当使用NSOperations和NSOperationQueues时,会有一些不必要的开销。 这些是Cocoa对象,它们需要分配和释放。 在我写的以60 FPS渲染3D场景的iOS应用程序中,我使用NSOperations来封装每个渲染帧。 当我描述这一点时,这些NSOperations的创建和拆卸在正在运行的应用程序中占据了很大一部分CPU周期,并且正在放慢速度。 我用简单的块和GCD串行队列取代了这些,并且开销消失了,导致显着更好的渲染性能。 这不是我唯一注意到使用NSOperations的地方,我已经在Mac和iOS上看到了这一点。
其次,基于块的调度代码有一种优雅,在使用NSOperations时很难匹配。 将几行代码封装在一个块中并将其分派到串行队列或并发队列中执行是非常方便的,其中创建自定义NSOperation或NSInvocationOperation来执行此操作需要更多的支持代码。 我知道你可以使用一个NSBlockOperation,但是你可能会把一些东西发给GCD。 将这些代码与您的应用程序中的相关处理内联地包装成块,在我看来,它们会导致更好的代码组织,而不是具有封装这些任务的单独方法或自定义NSOperations。
NSOperations和NSOperationQueues仍然有非常好的用途。 GCD没有真正的依赖关系概念,NSOperationQueues可以设置相当复杂的依赖关系图。 我在少数情况下使用NSOperationQueues。
总的来说,虽然我通常主张使用完成任务的最高抽象级别,但我认为这是一个针对GCD较低级别API的案例。 在我讨论过的iOS和Mac开发人员中,绝大多数人选择使用GCD而不是NSOperations,除非他们的操作系统版本不支持它(iOS 4.0和Snow Leopard之前的版本)。
GCD
是一个低级的基于C的API。
NSOperation
和NSOperationQueue
是Objective-C类。
NSOperationQueue
是GCD
客观C封装器。 如果您使用的是NSOperation,则隐式使用Grand Central Dispatch。
GCD优于NSOperation:
一世。 履行
对于GCD
实现是非常轻量级的
NSOperationQueue
复杂而且重量很重
与GCD相比NS的操作优势:
一世。 操作控制
你可以暂停,取消,恢复NSOperation
II。 依赖
你可以在两个NSOperations
之间建立一个依赖关系
直到其所有依赖项返回true才能开始操作。
III。 操作状态
可以监视操作或操作队列的状态。 准备好,执行或完成
IV。 最大操作次数
您可以指定可以同时运行的最大排队操作数
何时去GCD
或NSOperation
当你想要对队列进行更多的控制时(使用上面提到的),使用NSOperation
并且对于你想要较少开销的简单情况(你只需要做一些“进入后台”的工作,只需很少的额外工作)就可以使用GCD
参考:
https://cocoacasts.com/choosing-between-nsoperation-and-grand-central-dispatch/ http://iosinfopot.blogspot.in/2015/08/nsthread-vs-gcd-vs-nsoperationqueue.html http:/ /nshipster.com/nsoperation/
上一篇: NSOperation vs Grand Central Dispatch
下一篇: Cancelling NSOperation from NSOperationQueue cause crash