iOS 中多线程的最佳方式是什么,因为我们有三个选项 GCD NSThread
、 和NSOperationQueue
?我很困惑哪一个是最好的?如果没有,那么应该在什么场景下使用哪个以及它们有何不同,如果有人有一些很好的使用示例NSOperationQueue
,请分享,以便我学习。
2 回答
简单的回答:
当您想要或需要直接控制您创建的线程时,请使用 NSThread(甚至 pthreads API),例如,您需要对线程优先级进行细粒度控制,或者与其他一些直接出售/使用线程对象的子系统交互,而您需要与它保持在同一页面上。这种情况很少见,但确实会发生,尤其是在实时应用程序中。
当您的任务非常适合简单的并行化时,请使用 GCD,例如,您只想将一些工作“扔到后台”而几乎没有额外的工作,您有一些数据结构,您只想序列化访问(并且串行队列很棒以无锁方式执行此操作),您有一些 for 循环可以很好地与 dispatch_apply() 并行化,您有一些 GCD 的源 API 将使您能够在后台轻松处理的数据源/计时器等. GCD 非常强大,你可以用它做更多的事情,但这些都是相对“不费吹灰之力”的场景,你不想陷入初始化和设置任务中,就像简单地“做基本的并行的东西”。
当您已经在 Cocoa API 层(而不是直接用 C 语言编写 POSIX API)并且想要并行化更复杂的操作时,请使用 NSOperation。NSOperation 允许子类化、任意复杂的依赖图、取消和支持许多其他可能对您有用的高级语义。NSOperation 实际上在幕后使用 GCD,因此它与 GCD 一样具有多核、多线程能力,尽管它也带来了 Foundation 框架,所以如果你在 POSIX 层进行黑客攻击,你可能想要使用选项#2。
然而,正如其他人所说,这完全取决于您要做什么,因此您的问题没有单一甚至普遍正确的答案。
我最近一直倾向于 NSOperationQueue。这在内部使用 GCD 并且是线程安全的,并且使用起来非常简单。