3

如果使用以下功能运行同步块:dispatch_sync使用从应用程序中检索到的队列dispatch_get_main_queue()挂起并且该块未执行,而如果我通过从获得的队列:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)它可以正常工作。

dispatch_queue_t q;
q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//q = dispatch_get_main_queue();  //If uncommented the app hang

dispatch_sync(q , ^{
    NSLog(@".");
});

为什么使用从dispatch_get_main_queue()导致应用程序挂起并且块没有被执行的队列?

4

2 回答 2

10

如果您从主队列同步调度到主队列,它应该冻结。您要求它向主队列分派一段代码,但因为它是同步的 ( dispatch_sync),您要求它冻结当前队列(主队列),直到分派队列(也是主队列)响应您刚刚添加的内容!它显然不能这样做。

要么做dispatch_async,要么分派到不同的队列!

于 2012-10-02T20:22:52.783 回答
0

除了 Rob 的回答,这里是 Grand Central Dispatch 的文档(编程指南参考)。这是一组很棒的库,并且使并发几乎没有痛苦,但它并不是万无一失的。

于 2012-10-02T20:30:21.660 回答