【发布时间】:2011-05-19 16:41:56
【问题描述】:
在为 iPhone 编程时,哪些任务更适合使用 NSOperation 而不是使用 GCD?
在我看来,他们似乎也在做同样的事情。我看不出一个人的优势和劣势。
【问题讨论】:
标签: ios cocoa-touch nsoperation grand-central-dispatch
在为 iPhone 编程时,哪些任务更适合使用 NSOperation 而不是使用 GCD?
在我看来,他们似乎也在做同样的事情。我看不出一个人的优势和劣势。
【问题讨论】:
标签: ios cocoa-touch nsoperation grand-central-dispatch
我认为这里没有提到的一件事是NSOperations 可以在执行期间被取消,而一旦执行开始,一个块就可以保证完成。话虽如此,可以暂停一个 GCD 队列(dispatch_suspend()),这样当前正在执行的块之后的任何块都不会被执行。
【讨论】:
显然,从 iOS 4 开始,NSOperationQueue 是基于 GCD 构建的;文档还没有更新。在此处查看 Apple 员工的此帖子:https://devforums.apple.com/message/352770(您可能需要创建一个帐户)因此,您应该遵循 Mike Abdullah 的建议并使用最简单的 API 来完成手头的任务。 dispatch_async 是较低级别的,通常是 C 类型的东西(但不限于),并且适用于一次性和顺序类型的交易(在这个队列上触发这个块,FTW)。 NSOperationQueues 是更高级别的、Objective-C 的东西,如果您在代码中的各个点添加大量操作,和/或需要管理并发、优先级和依赖关系,那么它是很好的。至少我是这样使用它们的。
【讨论】:
NSOperations 文档中看到这个:An operation queue executes its operations either directly, by running them on secondary threads, **or** indirectly using the libdispatch library (also known as Grand Central Dispatch).
对于此类问题,请使用最简单的 API。衡量这是否是性能问题,然后在需要时重新评估。
【讨论】:
NSOperation 是建立在 GCD 之上的,所以问题更多的是你是使用 NSOperation 还是直接将块传递给 GCD。
NSOperation 体积庞大,需要更多样板代码来设置它,但它具有更多功能。您可以在代码的各个部分创建相同的NSOperation 子类,并将它们放入队列并运行它。
通过例如将块传递给 GCD dispatch_async 快速且一次性。您通常不会在其他任何地方重用块;您只需设置一个仅在该代码点执行的块,将其传递给 GCD 或其他 API,然后快速继续。
所以各有千秋。
【讨论】:
NSOperation 肯定有更多的开销,但这并不能使 GCD 适合时间关键的操作。同样,NSOperation(在主队列中)是 GCD 上的一个薄层。所以你的问题没有意义。两者都是 GCD。
NSOperation。如果任务仅从程序的单个部分运行,我将只使用dispatch_async。
NSOperationQueue 上使用 GCD,请参阅类参考。