派遣到并发队列导致在主线程上执行?

时间:2014-08-12 02:42:12

标签: ios multithreading cocoa-touch grand-central-dispatch

Apple的GCD文档声明如下:

  

GCD提供并管理应用程序可以使用的FIFO队列   以块对象的形式提交任务。提交的块   调度队列在完全由...管理的线程池上执行   系统。不保证任务的线程   执行。 GCD提供三种队列:

这是否意味着即使我发出了诸如

之类的请求
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{...});

它可能导致在主线程上执行代码块?在这种情况下,似乎在主线程上使用并发队列调用dispatch_sync可能会导致主线程卡在等待自身的死锁情况。

我对GCD文件的解释是否正确?

2 个答案:

答案 0 :(得分:1)

是的,似乎dispatch_sync到全局队列可能意味着如果调用者在主线程上,则在主线程上执行代码。 dispatch_sync的文档说明:

  

作为优化,此函数会在可能的情况下调用当前线程上的块。

dispatch_sync always scheduling a block on Main Thread

答案 1 :(得分:0)

由于dispatch_sync等待块完成,因此无论块是在并发线程还是主线程上执行都没有多大区别;无论如何,主线程被阻止了。

因此,从主线程调用dispatch_sync会有效地阻塞主线程直到块完成,因此除非块仅执行一小段时间,否则这是一个坏主意。