调用detachNewThreadSelector:target:object:vs dispatch_async()

时间:2012-06-20 15:38:55

标签: multithreading grand-central-dispatch nsthread nsoperation

并发编程指南(PDF版)的第37和39页似乎是矛盾的。在第37页中,代码段指定了以下内容:

if (![anOp isConcurrent])
    [anOp start];
else
    [NSThread detachNewThreadSelector:@selector(start) toTarget:anOp withObject:nil];

这看起来很好,除了第39页的文档说明:

  

您可以使用调度队列执行几乎所有的任务   你曾经在不同的线程上执行。派遣的优势   队列是他们更容易使用,更有效率   执行那些任务而不是相应的线程代码。

所以不是调用detachNewThreadSelector:target:object:,而是为什么不调用dispatch_async()的代码呢?

1 个答案:

答案 0 :(得分:0)

我可以看到你说的话。我认为每种方式都有效,但根据情况你应该选择去哪个根。需要注意的是NSOperationQueues很好用;在mac osx中,他们使用GCD进行优化,因此它们是一个不错的选择。在iOS 4及更低版本中,它们没有。因此,如果使用以前版本的iOS,则应该认真考虑使用GCD。如果您发送新的NSThread,操作系统必须保持切换线程,这可能是性能问题。 GCD使用池方法,这意味着如果有好处,它将重新使用现有线程。

希望这能指出你正确的方向