我学到的iOS编程归功于斯坦福大学的CS193p课程(在iTunes U),以及从大书呆子牧场的iOS编程的书。 在这两个,他们建议使用dispatch_async()
dispatch_get_main_queue()
等处理线程和并发操作。 然而,在WWDC 2012的上构建并发用户对话,音箱推荐使用的NSOperationQueue
。
之间有什么区别dispatch_*()
和NSOperationQueue
,并没有任何理由(技术,性能,风格,或以其他方式),我应该使用一个比其他? 是NSOperationQueue
只是周围的Objective-C包装dispatch_async
,还是有更多的什么原因呢?
NSOperation*
类是较高层次的API。 他们隐藏你GCD的低级别的API,这样就可以集中精力完成任务。
经验法则是: 先使用的最高级别的API,然后根据你需要完成的任务分解。
这种方法的优点是你的代码保持最不可知的具体实施供应商提供。 在这个例子中,使用NSOperation
,你就可以使用苹果的实现(使用GCD)执行排队。 如果苹果决定更改他们可以这样做幕后执行的细节,而不会破坏你的应用程序的代码。
其中一个例子是苹果自嘲的GCD和使用完全不同的库(这是不可能的,因为苹果创建GCD和每个人似乎都喜欢它)。
关于我建议您参考以下资源事项:
- http://nshipster.com/nsoperation/
- https://cocoasamurai.blogspot.de/2009/09/guide-to-blocks-grand-central-dispatch.html
- https://cocoasamurai.blogspot.de/2009/09/making-nsoperation-look-like-gcd.html
- https://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift
- https://developer.apple.com/documentation/foundation/operationqueue
- 视频: 高级NSOperations,WWDC 2015年,会话226
- 示例代码: 高级NSOperations,WWDC 2015年
- 视频: 建立反应灵敏,高效的应用程序与GCD,WWDC 2015年,会话718
现在,关于你的具体问题:
什么是调度_之间的差异*()和NSOperationQueue,[...]
往上看。
[...],是没有任何理由(技术,性能,风格,或以其他方式),我应该使用一个比其他?
如果NSOperation
东西得到你的工作做好,用它。
是NSOperationQueue只是一个围绕dispatch_async Objective-C的包装,还是有更多的什么原因呢?
是的,它基本上是。 另外像操作依赖功能,方便启动/停止。
修订
也就是说,使用最高级别的API第一听起来耐人寻味。 当然,如果你需要一个快速的方法来对特定线程上运行的代码,你不想写一大堆的样板代码,这使得使用较低级别C函数完全有效:
dispatch_async(dispatch_get_main_queue(), ^{
do_something();
});
但考虑这个问题:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
do_something();
}];
我推荐后者,因为大多数的你会写是Objective-C的反正那么为什么不接受它的表现?
NSOperationQueue比dispatch_async更重的重量(),它只是基于GCD在一个非常有限的方式(实质上它只是使用全局调度队列执行其异步操作,但以其他方式使用没有其他GCD设施)。
NSOperationQueue确实有没有GCD提供的额外功能,但如果你不需要这些,使用GCD会给你更好的性能。
他们都在做同样的事情,但它们之间的主要区别是觉得─我们可以取消该任务,如果我们想同时使用的NSOperation而如果我们使用GCD,那么一旦我们分配任务排队那么我们是不是可以取消它。
添加到上面的回答,排队的NSOperation超过GCD的另一个优点是
1) 依赖关系: -我们可以设置两个NSOperations操作之间的依赖关系将无法启动,直到所有的依赖的成品返回true。
2) 操作的状态: -我们可以监控一个操作或操作队列的状态。 准备好,执行或完成
3) 操作数量上限: -我们可以指定可同时运行的排队操作的最大数量
文章来源: (iOS) dispatch_async() vs. NSOperationQueue