苹果的Grand Central Dispatch参考文档中这样说:
“……如果您的应用程序需要在系统的Unix级别上运行,例如,如果它需要操作文件描述符、Mach端口、信号或计时器。 GCD不仅限于系统级应用程序,但在将其用于更高级别的应用程序之前,您应该考虑通过Cocoa(通过NSOperation和block对象)提供的类似功能是否更容易使用或更适合您的需求。”。
我实际上无法想象,在高级应用程序中,必须使用GCD而不能使用NSOperation的情况。
有什么想法吗?
苹果的Grand Central Dispatch参考文档中这样说:
“……如果您的应用程序需要在系统的Unix级别上运行,例如,如果它需要操作文件描述符、Mach端口、信号或计时器。 GCD不仅限于系统级应用程序,但在将其用于更高级别的应用程序之前,您应该考虑通过Cocoa(通过NSOperation和block对象)提供的类似功能是否更容易使用或更适合您的需求。”。
我实际上无法想象,在高级应用程序中,必须使用GCD而不能使用NSOperation的情况。
有什么想法吗?
Operation
和OperationQueue
是类型NSObject
(Objective-C遗产),而DispatchQueue
、DispatchWorkItem
和DispatchGroup
则不是。 - l --marc lGCD 是一种轻量级的方式,用于表示将要并发执行的工作单元。您无需安排这些工作单元;系统会为您处理调度。在块之间添加依赖关系可能会让人头痛。取消或暂停块会给开发者带来额外的工作!
与 GCD 相比,NSOperation 和 NSOperationQueue 会增加一些额外的开销,但您可以在各种操作之间添加依赖关系。您可以重复使用、取消或暂停操作。NSOperation 兼容键值观察(KVO);例如,您可以通过监听 NSNotificationCenter 来启动 NSOperation。
更多详细的解释,请参考此问题:NSOperation vs Grand Central Dispatch
NSOperation没有dispatch_source_t、dispatch_io、dispatch_data_t、dispatch_semaphore_t等等的相应功能,而且它的开销有点大。
另一方面,libdispatch没有操作依赖性、操作优先级(队列优先级有些不同)或操作的KVO等等功能。
NSOperation
现在是基于 GCD
构建的,因此除非其中一个有你所需而另一个没有的东西,否则它们之间并没有太大的优势。 - hypercrypt我最近在阅读相关资料,不出所料,人们对此有不同的看法。
我想不到什么情况下需要使用GCD而不是NSOperation,但这并不意味着不存在这样的情况。然而,就最佳实践编码而言,我同意一般的观点:
如果你有几个工具都能胜任工作(在这种情况下,你可以选择NSOperation或者GCD block),那么就使用抽象级别最高的类(即最高级别的API)。这不仅通常更容易使用/代码更少,而且还可以从未来可能引入的更高级别API的潜在增强中获益。