29

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

在我看来,他们似乎在做同样的事情。我看不出一个人的优势和劣势。

4

4 回答 4

25

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

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

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

所以各有各的优点。

于 2010-12-03T11:10:58.103 回答
13

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

于 2011-08-06T21:42:46.030 回答
8

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

于 2010-12-03T16:52:38.620 回答
3

我不相信这里提到的一件事是NSOperations 可以在执行期间取消,而一旦执行开始,一个块就保证完成。话虽如此,可以暂停 GCD 队列(dispatch_suspend()),这样当前正在执行的块之后的任何块都不会被执行。

于 2011-11-23T15:12:12.603 回答