哪个是GCD,NSThread或NSOperationQueue中最好的?

Sum*_*ive 22 multithreading nsthread nsoperationqueue grand-central-dispatch ios

什么是iOS中多线程的最佳方式,因为我们有三个选项GCD NSThread,和NSOperationQueue?我很困惑哪一个是最好的?如果没有,那么哪个应该用于什么情况以及它们如何不同,如果有人有一些很好的使用示例NSOperationQueue,请分享以便我可以学习.

jkh*_*jkh 40

简单回答:

  1. 当您需要或需要直接控制您创建的线程时,请使用NSThread(甚至是pthreads API),例如,您需要对线程优先级进行细粒度控制,或者与直接销售/使用线程对象的其他子系统连接,并且需要与它保持同一页面.这种情况很少见,但确实会发生,特别是在实时应用中.

  2. 当你的任务非常适合简单的并行化时使用GCD,例如你只想把一些工作"投入到后台"而只需要很少的额外工作,你有一些数据结构你只想序列化访问(并且串行队列很棒)为了以无锁方式执行此操作),您有一些for循环可以很好地与dispatch_apply()进行并行化,您有一些数据源/计时器,GCD的源API将使您能够在后台轻松处理等等GCD是非常强大的,你可以使用它远远超过这个,但这些都是相对"没有脑子"的场景,你不想陷入初始化和设置任务,就像简单地"做基本"并行的东西".

  3. 当你已经进入Cocoa API层时(使用直接C写入POSIX API)并使用更复杂的操作来进行并行化时,请使用NSOperation.NSOperation允许子类化,任意复杂的依赖图,取消和支持许多其他可能对您有用的更高级语义.NSOperation实际上使用了GCD,所以它就像GCD一样多核,多线程,虽然它也带来了基础框架,所以如果你正在攻击POSIX层,你可能想要使用它选项#2.

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

  • 在设置线程的优先级之前,要问的第一个问题是"为什么?" 我引用了实时应用程序(例如音频,视频处理)作为这样做的主要原因,因为否则很少需要这样做.GCD在全局并发队列(后台,低,中,高)中提供4个级别的优先级,这几乎总是足以满足应用程序的需要.如果一个线程需要3分钟才能完成,设置优先级将无济于事 - 要么将其分解为较小的任务,要么只是让操作系统动态设置长时间运行的线程与短期线程的优先级(它会) (2认同)