(iOS)dispatch_async()与NSOperationQueue
我学习了iOS编程,这要归功于Stanford的CS193p课程(在iTunes U上)以及Big Nerd Ranch的iOS编程书籍。 在这两者中,他们都build议使用dispatch_async()
, dispatch_get_main_queue()
等来处理线程和并发操作。 但是,在WWDC 2012关于构build并发UI的会议上,演讲者build议使用NSOperationQueue
。
dispatch_*()
和NSOperationQueue
之间有什么NSOperationQueue
,有没有什么理由(技术,性能,风格或其他),我应该使用它们之一? NSOperationQueue
仅仅是一个NSOperationQueue
的Objective-C包装,还是有更多的呢?
NSOperation*
类是更高级别的API。 他们隐藏了GCD的较低级别的API,这样你就可以集中精力完成任务。
经验法则是:首先使用最高级别的api,然后根据您需要完成的任务降级。
这种方法的优点是你的代码对于供应商提供的具体实现来说是最不可知的。 在这个例子中,使用NSOperation
,你将使用Apple的执行排队(使用GCD)。 如果苹果决定改变幕后实施的细节,他们可以做到这一点,而不会破坏你的应用程序的代码。
其中一个例子就是Apple弃用GCD并使用完全不同的库(这不太可能,因为苹果公司创build了GCD,每个人似乎都喜欢它)。
关于此事,我build议咨询下列资源:
- 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
- video: 高级NSOperations ,WWDC 2015,Session 226
- 示例代码: 高级NSOperations ,WWDC 2015
- video: 利用GCD构build响应迅速 , 高效的应用程序 ,WWDC 2015,第718课
现在,针对您的具体问题:
dispatch _ *()和NSOperationQueue之间有什么区别,
往上看。
有什么理由(技术,性能,风格或其他),我应该使用一个吗?
如果NSOperation
东西完成你的工作,使用它。
NSOperationQueue仅仅是一个dispatch_async的Objective-C包装,还是有更多的呢?
是的,它基本上是。 Plusfunction,如操作依赖,易于启动/停止。
修订
说,使用最高级别的API首先听起来有趣。 当然,如果你需要一个快速的方法来在特定的线程上运行代码,你不想编写大量的样板代码,这使得低层C函数的使用完全有效:
dispatch_async(dispatch_get_main_queue(), ^{ do_something(); });
但是考虑一下:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ do_something(); }];
我推荐后者,因为大部分你会写的Objective-C,为什么不接受它的performance力?
NSOperationQueue比dispatch_async()要重得多,它只是以非常有限的方式基于GCD(本质上它只是使用全局调度队列来执行其asynchronous操作,否则不使用其他GCD工具)。
NSOperationQueue具有GCD不提供的其他function,但如果不需要这些function,使用GCD可以提供更好的性能。
他们两个都做同样的事情,但他们之间的主要区别在于,如果我们想要使用NSOperation,我们可以取消任务,而如果我们使用GCD,那么一旦我们将任务分配给队列,那么我们无法取消它。
加上上面的答案,NSOperation队列在GCD上的另一个优点是
1) 依赖关系: –我们可以build立两个NSOperations之间的依赖关系,直到所有的依赖关系返回true才结束。
2) 操作状态: –我们可以监视操作或操作队列的状态。 准备好,执行或完成
3) 最大操作次数: –我们可以指定可以同时运行的最大排队操作数