Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 调用detachNewThreadSelector:target:object:vs dispatch_async()_Multithreading_Grand Central Dispatch_Nsthread_Nsoperation - Fatal编程技术网

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

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页的文档中指出: 您可以使用调度队列执行几乎所有需要执行的任务 您过去常常在单独的线程上执行。调度的优势

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

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。