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