Multithreading 调用detachNewThreadSelector:target:object:vs dispatch_async()
《并发编程指南》(PDF版)第37页和第39页似乎存在矛盾。在第37页中,代码段指定了以下内容:Multithreading 调用detachNewThreadSelector:target:object:vs dispatch_async(),multithreading,grand-central-dispatch,nsthread,nsoperation,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页的文档中指出: 您可以使用调度队列执行几乎所有需要执行的任务 您过去常常在单独的线程上执行。调度的优势
if (![anOp isConcurrent])
[anOp start];
else
[NSThread detachNewThreadSelector:@selector(start) toTarget:anOp withObject:nil];
这看起来不错,只是第39页的文档中指出:
您可以使用调度队列执行几乎所有需要执行的任务
您过去常常在单独的线程上执行。调度的优势
队列的优点是它们使用起来更简单,而且效率更高
执行这些任务比执行相应的线程化代码更有效
因此,与其调用detachNewThreadSelector:target:object:,为什么代码不调用dispatch\u async()?耶,我明白你的意思了。我认为每种方法都有效,但根据具体情况,你应该选择哪种根。需要注意的是,
NSOperationQueues
很好使用;在mac osx中,它们使用GCD
进行优化,因此它们是一个不错的选择。在iOS 4及以下版本中,它们不会。所以使用<代码> GCD是对iOS以前版本的工作应该认真考虑的。如果分派一个新的NSThread
,操作系统必须不断切换线程,这可能是一个性能问题GCD
使用pools方法,这意味着如果可以的话,它将重用现有线程
希望这为您指明了正确的方向因为iOS 4,NSOperationQueue使用GCD。