哪些任务更适合使用NSOperation
而不是在为iPhone编程时使用GCD
?
对我来说,他们似乎做同样的事情。我看不出自己的优势和劣势。
答案 0 :(得分:25)
NSOperation
建立在GCD之上,因此问题更多的是您是使用NSOperation
还是直接将块传递给GCD。
NSOperation
体积庞大,需要更多的样板代码来设置它,但它有更多的功能。您可以在代码的各个部分中创建相同的NSOperation
子类,并将它们放入队列并运行它。
通过例如将块传递给GCD dispatch_async
快速且一次性使用。您通常不会在其他地方重复使用块;您只需设置一个仅在代码的该点执行的块,将其传递给GCD或其他API,然后快速继续。
所以每个都有它的优点。
答案 1 :(得分:13)
显然,NSOperationQueue是基于iOS 4的GCD构建的;文档尚未更新。请在这里查看Apple员工发布的帖子:https://devforums.apple.com/message/352770(您可能需要创建一个帐户)因此,您应该遵循Mike Abdullah的建议,并使用最简单的API来完成手头的任务。 dispatch_async是较低级别,通常是C类型的东西(但不限于此),适用于单次和顺序类型的交易(在此队列中触发此块,FTW)。 NSOperationQueues是更高级别的Objective-C,如果您在代码中的各个点添加大量操作,并且/或者需要管理并发性,优先级和依赖性,那么它们是很好的。至少我是如何使用它们的。
答案 2 :(得分:8)
与此类问题一样,请使用最简单的API。测量它是否是性能问题,然后在需要时重新评估。
答案 3 :(得分:3)
我不相信这里提到的一件事是NSOperation
s可以在执行期间被取消,而一个块保证在执行开始后完成。话虽如此,可以暂停GCD队列(dispatch_suspend()
),这样就不会执行当前正在执行的块之后的任何块。