GCD,NSThread或NSOperationQueue中哪一个最好?

我们有三个选项GCD, NSThreadNSOperationQueue ,iOS中multithreading的最佳方式是什么? 我很困惑哪一个是最好的? 如果没有,那么应该在什么情况下使用,以及它们如何不同,以及如果有人使用NSOperationQueue一些很好的例子,请分享,以便我可以学习。

简单的回答:

  1. 当你想要或需要直接控制你创build的线程时,使用NSThread(或者甚至是pthreads API),例如你需要对线程优先级进行细粒度的控制,或者与其他一些直接发布/消耗线程对象的子系统进行交互需要与它保持同一页面。 这种情况很less发生,特别是在实时应用中。

  2. 当你的任务适合于简单的并行化时,使用GCD,比如你只是想把一些工作“投入到后台”,只需要很less的额外的工作,你有一些数据结构,你只是想序列化访问(和串行队列是伟大的为了以无锁的方式做到这一点),你有一些适合与dispatch_apply()并行的for循环,你有一些数据源/定时器,GCD的源API可以让你在后台轻松处理等等GCD是相当强大的,你可以使用它比这更多,但是这些都是相对的“没有脑子”的情况下,你不想陷入初始化和设置任务,就像“做基本的东西并行“。

  3. 当你已经在Cocoa API层上的时候使用NSOperation(而不是直接写C到POSIX API)并且有更复杂的操作要并行化。 NSOperation允许子类化,任意复杂的依赖关系图,取消和支持一些可能对你有用的其他更高级的语义。 NSOperation实际上使用了GCD,所以它像GCD一样具有多核心,multithreading的能力,虽然它也带来了基础框架,所以如果你在黑客攻击POSIX层,你可能想使用选项#2。

然而,正如其他人所说,这一切都取决于你正在尝试做什么,所以你的问题没有单一的,甚至是普遍正确的答案。

最近我一直倾向于NSOperationQueue。 这在内部使用GCD,并且是线程安全的,而且使用起来非常简单。