(iOS)dispatch_async()与NSOperationQueue

Don*_*urr 48 nsoperationqueue grand-central-dispatch

感谢Stanford的CS193p课程(在iTunes U上)以及Big Nerd Ranch的iOS编程书,我学习了iOS编程.在这两个,他们建议使用dispatch_async(),dispatch_get_main_queue()等来处理线程和并发操作.但是,在WWDC 2012关于构建并发UI的会议上,发言人建议使用NSOperationQueue.

dispatch_*()和之间NSOperationQueue有什么区别,有什么理由(技术,性能,风格或其他方面)我应该使用另一个吗?是否NSOperationQueue只是一个Objective-C的包装器dispatch_async,或者是有更多的什么原因呢?

gla*_*asz 75

NSOperation*课程是更高级别的api.它们隐藏了GCD的低级api,因此您可以集中精力完成任务.

经验法则是:首先使用最高级别的api,然后根据您需要完成的任务降级.

这种方法的优点是您的代码与供应商提供的特定实现保持最不相关.在这个例子中,使用NSOperation,你将使用Apple的执行排队实现(使用GCD).如果Apple决定在幕后更改实现细节,他们可以在不破坏应用程序代码的情况下这样做.
其中一个例子就是Apple贬低GCD并使用完全不同的库(这不太可能,因为Apple创建了GCD并且每个人似乎都喜欢它).

关于此事,我建议咨询以下资源:

现在,关于您的具体问题:

dispatch _*()和NSOperationQueue之间有什么区别,[...]

往上看.

[...]是否有任何理由(技术,性能,风格或其他方面)我应该使用一个而不是另一个?

如果这些NSOperation东西能完成你的工作,那就用它吧.

NSOperationQueue只是一个围绕dispatch_async的Objective-C包装器,还是有更多的东西呢?

是的,它基本上是.还有诸如操作依赖性,易于启动/停止等功能.

修订

要说,首先使用最高级别的api可能听起来很有趣.当然,如果你需要一种快速的方法来在特定的线程上运行代码,你不需要编写大量的样板代码,这使得低级C函数的使用完全有效:

dispatch_async(dispatch_get_main_queue(), ^{
  do_something();
});
Run Code Online (Sandbox Code Playgroud)

考虑一下:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
  do_something();
}];
Run Code Online (Sandbox Code Playgroud)

我推荐后者,因为你写的大部分内容都是Objective-C,所以为什么不接受它的表现力呢?


das*_*das 10

NSOperationQueue比dispatch_async()重得多,它仅以非常有限的方式基于GCD(实质上它只是使用全局调度队列来执行其异步操作,但不使用其他GCD工具).

NSOperationQueue确实具有GCD未提供的附加功能,但如果您不需要这些功能,使用GCD将为您提供更好的性能.


Meh*_*kar 10

他们都在做同样的事情,但他们之间的主要区别在于 - 我们可以在使用NSOperation时取消任务,而如果我们使用GCD,那么一旦我们将任务分配到队列,那么我们就无法取消它.