哪些任务比GCD更适合NSOperation?

dub*_*eat 29 cocoa-touch nsoperation grand-central-dispatch ios

哪些任务更适合使用NSOperation,而不是GCD在为iPhone编程时使用?

对我来说,他们似乎做同样的事情.我看不出一方面的优势和劣势.

Yuj*_*uji 25

NSOperation是建立在GCD之上的,所以问题更多的是关于是否使用NSOperation或直接将块传递给GCD.

一个NSOperation是体积大,需要更多的样板代码来设置它,但它有很多更多的功能.您可以NSOperation在代码的各个部分中创建相同的子类,并将它们放入队列并运行它.

通过例如将块传递给GCD dispatch_async是快速且一次性的.您通常不会在其他地方重复使用块; 您只需设置一个块,该块仅在代码的该点执行,将其传递给GCD或其他API,然后快速继续.

所以每个都有它的优点.

  • 这是标记iOS所以.... NSOperationQueue不是建立在GCD之上(尚未).请参阅:http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSOperationQueue_class/Reference/Reference.html%23//apple_ref/doc/uid/TP40004592注意:在iOS中,操作队列不会使用Grand Central Dispatch执行操作.它们为非并发操作创建单独的线程,并从当前线程启动并发操作.有关并发和非并发操作之间的区别及其执行方式的讨论,请参阅NSOperation类参考. (11认同)
  • 也就是说,正如我上面所写,如果我在程序的各个部分创建并运行相同的后台任务,我将创建一个"NSOperation".如果任务仅从程序的一个部分运行,我将只使用`dispatch_async`. (4认同)
  • 可以公平地说,nsoperation非常适合非时间关键的操作,例如下载文件,gcd非常适合时间关键操作,例如在音频上执行dsp吗?你能举个例子说明你何时使用一个而不是另一个? (3认同)
  • 我不这么认为."NSOperation"肯定会有更多的开销,但这并不能使GCD适合时间关键的操作.同样,`NSOperation`(在主队列中)是GCD上的薄层.所以你的问题没有意义.两者都是*GCD. (2认同)
  • 在iOS4 +`NSOperationQueue`上使用GCD,请参阅类参考. (2认同)

sca*_*aba 13

显然,NSOperationQueue是基于iOS 4的GCD构建的; 文档尚未更新.请在这里查看Apple员工的这篇帖子:https://devforums.apple.com/message/352770(您可能需要创建一个帐户)因此,您应该遵循Mike Abdullah的建议并使用最简单的API来完成手头的任务.dispatch_async是较低级别,通常是C类型的东西(但不限于此),适用于单次和顺序类型的交易(在此队列中触发此块,FTW).NSOperationQueues是更高级别的Objective-C,如果您在代码中的各个点添加大量操作,并且/或者需要管理并发性,优先级和依赖性,那么它们是很好的.至少我是如何使用它们的.


Mik*_*lah 8

与往常一样,使用最简单的API.测量是否存在性能问题,然后根据需要重新评估.

  • 如果您告诉哪个API最简单,那么这个答案会很好. (7认同)
  • 哪个是最简单的,取决于手头的任务 (2认同)
  • 这听起来像是自己的问题.建议你从阅读文档开始. (2认同)