Ios 哪些任务比GCD更适合NSD操作?

Ios 哪些任务比GCD更适合NSD操作?,ios,cocoa-touch,nsoperation,grand-central-dispatch,Ios,Cocoa Touch,Nsoperation,Grand Central Dispatch,在为iPhone编程时,与使用GCD相比,哪些任务更适合使用NSOperation 在我看来,他们似乎做了同样的事情。我看不出一个操作的优缺点。NSOperation构建在GCD之上,所以问题更多的是您是使用NSOperation还是将块直接传递给GCD NSOperation体积庞大,需要更多的锅炉板代码来设置,但它有更多的功能。您可以在代码的不同部分创建相同的NSOperation子类,并将它们放入队列中并运行它 例如,通过dispatch\u async将块传递给GCD是一种快速且一次性的

在为iPhone编程时,与使用
GCD
相比,哪些任务更适合使用
NSOperation


在我看来,他们似乎做了同样的事情。我看不出一个操作的优缺点。

NSOperation
构建在GCD之上,所以问题更多的是您是使用
NSOperation
还是将块直接传递给GCD

NSOperation
体积庞大,需要更多的锅炉板代码来设置,但它有更多的功能。您可以在代码的不同部分创建相同的
NSOperation
子类,并将它们放入队列中并运行它

例如,通过
dispatch\u async
将块传递给GCD是一种快速且一次性的方法。您通常不会在其他任何地方重用块;您只需设置一个只在代码的该点执行的块,将其传递给GCD或其他API,然后快速继续


因此,每一种都有其优点

对于此类问题,请使用最简单的API。测量是否存在性能问题,然后在需要时重新评估。

显然,从iOS 4开始,NSOperationQueue就建立在GCD上;文档只是还没有更新。在这里查看一位苹果员工的帖子:(您可能需要创建一个帐户)因此,您应该遵循Mike Abdullah的建议,使用最简单的API来完成手头的任务。dispatch_async是较低级别的,通常是C类型的东西(但不限于),适用于一次性和顺序类型的交易(在此队列上触发此块,FTW)。NSOperationQueues是更高级别的、Objective-C的东西,如果您在代码的各个点添加了大量操作,并且/或者需要管理并发性、优先级和依赖性,那么它是很好的。至少我是这样使用它们的。

我不相信这里提到的一件事是,
NSOperation
s可以在执行期间取消,而一个块保证在执行开始后完成。话虽如此,GCD队列可以挂起(
dispatch\u suspend()
),因此,当前执行的块之后的任何块都不会执行。

可以公平地说,nsoperation非常适合于非时间关键的操作,例如下载文件,而gcd非常适合于时间关键的操作,例如在音频上执行dsp吗?你能给我举个例子,说明什么时候你会用一个来代替另一个吗?我不这么认为<代码>NSOperation的开销肯定稍大一些,但这并不能使GCD适合时间关键型操作。同样,
NSOperation
(在主队列中)是GCD上的一个薄层。所以你的问题没有意义。两者都是GCD。也就是说,正如我在上面所写的,如果我在程序的不同部分创建并运行相同的后台任务,我将执行一个
NSOperation
。如果任务仅从程序的单个部分运行,我将只使用
dispatch\u async
。。。。NSOperationQueue尚未构建在GCD之上。请参阅:注意:在iOS中,操作队列不使用Grand Central Dispatch来执行操作。它们为非并发操作创建单独的线程,并从当前线程启动并发操作。有关并发操作和非并发操作之间的区别及其执行方式的讨论,请参阅NSOperation类参考。在iOS4+
NSOperationQueue
use GCD上,如果你告诉我哪一个API是最简单的,这个答案会很好。这是最简单的,而这主要取决于手上的任务,如果你不考虑手头的任务,我想知道两者最简单的API。但是,为了提供一个标准用例,假设您有一个不希望在主线程上执行的后台任务。它应该在完成后更改视图。这听起来像是它自己的问题。我建议你先看看这些文件,我还是不相信这是真的。这个答案已经过去2年了,我仍然在
NSOperations
文档中看到这一点:
操作队列直接执行其操作,通过在次线程上运行它们,**或**间接使用libdispatch库(也称为Grand Central Dispatch)。
@Answerbot从iOS 4和OS X 10.6开始,情况不再如此。阅读“概述”部分的最后两部分