(IOS)dispatch_async()与NSOperationQueue((iOS) dispa

2019-06-26 13:34发布

我学到的iOS编程归功于斯坦福大学的CS193p课程(在iTunes U),以及从大书呆子牧场的iOS编程的书。 在这两个,他们建议使用dispatch_async() dispatch_get_main_queue()等处理线程和并发操作。 然而,在WWDC 2012的上构建并发用户对话,音箱推荐使用的NSOperationQueue

之间有什么区别dispatch_*()NSOperationQueue ,并没有任何理由(技术,性能,风格,或以其他方式),我应该使用一个比其他? 是NSOperationQueue只是周围的Objective-C包装dispatch_async ,还是有更多的什么原因呢?

Answer 1:

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的反正那么为什么不接受它的表现?



Answer 2:

NSOperationQueue比dispatch_async更重的重量(),它只是基于GCD在一个非常有限的方式(实质上它只是使用全局调度队列执行其异步操作,但以其他方式使用没有其他GCD设施)。

NSOperationQueue确实有没有GCD提供的额外功能,但如果你不需要这些,使用GCD会给你更好的性能。



Answer 3:

他们都在做同样的事情,但它们之间的主要区别是觉得─我们可以取消该任务,如果我们想同时使用的NSOperation而如果我们使用GCD,那么一旦我们分配任务排队那么我们是不是可以取消它。



Answer 4:

添加到上面的回答,排队的NSOperation超过GCD的另一个优点是

1) 依赖关系: -我们可以设置两个NSOperations操作之间的依赖关系将无法启动,直到所有的依赖的成品返回true。

2) 操作的状态: -我们可以监控一个操作或操作队列的状态。 准备好,执行或完成

3) 操作数量上限: -我们可以指定可同时运行的排队操作的最大数量



文章来源: (iOS) dispatch_async() vs. NSOperationQueue