使用dispatch_get_main_queue()是否意味着我的代码将在主线程上运行?

17
以下代码在主线程上运行吗?"主队列"是否指的是主线程?
dispatch_async(dispatch_get_main_queue(),
^{
   // Some code
});

请注意,如果您正在主线程上执行此操作,并且已经在主线程上,则实际上它是相当无害的。当您拥有复杂的网络编码时,这非常方便! :) - Fattie
3个回答

28

在 dispatch async vs sync 中,异步(async)与同步(sync)的区别与并发(concurrent)与串行(serial)不同。异步意味着函数会立即返回,而同步则意味着它将等待块执行完毕。由于主线程/队列是串行的,事情会按顺序执行——我相信这意味着,因为你要求它在你正在分派的同一线程上异步调度,它会立即返回,等到当前运行循环和队列中的其他任何内容,然后执行代码块。

此方式在队列内部更加有用,而不是在主线程上使用。您可以处理数据,让 UI 知道要更新,并继续处理而不必等待所有东西重新绘制等。这就是为什么你经常会在另一个 dispatch_async(并发队列) 中看到对主线程的 dispatch_async 调用,而不仅仅是一个 dispatch_sync。


24

是的。根据Apple开发者网站

调度框架提供了一个默认的串行队列供应用程序使用。可以通过dispatch_get_main_queue()访问此队列。


2
只有在与主线程关联的运行循环存在时,才能保证它仅在主线程上运行。 - CouchDeveloper
1
在这里以及以下,CouchDeveloper是正确的。运行man dispatch_main,您会发现以下内容:“Cocoa应用程序不需要调用dispatch_main()。提交到主队列的块将作为应用程序主NSRunLoop或CFRunLoop的“公共模式”的一部分执行。但是,在使用dispatch_main()的应用程序中提交到主队列的块不能保证在主线程上执行。” - beOn

7

3
如果主线程关联了一个运行循环,那么通过dispatch_async(dispatch_get_main_queue(), block)调度的代码块将保证在主线程上执行。否则,该代码块可能会在任何线程上执行,这种说法并不完全正确。请注意,我已经尽力以最通俗易懂的方式翻译,并保持原意不变。 - CouchDeveloper
1
主线程在Cocoa应用程序中始终具有运行循环,@CouchDeveloper。 - jscs
2
我偶然发现了一个问题:在一个简单的控制台C++程序中,使用dispatch_main()时,dispatch_async(dispatch_get_main_queue(), ...)没有在主线程上执行(一直如此)。然后,使用RunLoop,它在主线程上执行。dispatch的man页面也没有明确提到它会在主线程上执行:“dispatch框架为应用程序提供了一个默认的串行队列。该队列通过dispatch_get_main_queue()函数访问。” - CouchDeveloper
虽然这是古老的历史,但如果您仍在寻找相反的信息,“man dispatch_main”说:“然而,在使用dispatch_main()的应用程序中提交到主队列的块不能保证在主线程上执行。” - dmaclach
古老的历史了,但如果你仍然在寻找相反的信息,man dispatch_main说:“然而,在使用dispatch_main()的应用程序中提交到主队列的块不保证在主线程上执行。” - dmaclach
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接