以下代码在主线程上运行吗?"主队列"是否指的是主线程?
dispatch_async(dispatch_get_main_queue(),
^{
// Some code
});
dispatch_async(dispatch_get_main_queue(),
^{
// Some code
});
在 dispatch async vs sync 中,异步(async)与同步(sync)的区别与并发(concurrent)与串行(serial)不同。异步意味着函数会立即返回,而同步则意味着它将等待块执行完毕。由于主线程/队列是串行的,事情会按顺序执行——我相信这意味着,因为你要求它在你正在分派的同一线程上异步调度,它会立即返回,等到当前运行循环和队列中的其他任何内容,然后执行代码块。
此方式在队列内部更加有用,而不是在主线程上使用。您可以处理数据,让 UI 知道要更新,并继续处理而不必等待所有东西重新绘制等。这就是为什么你经常会在另一个 dispatch_async(并发队列) 中看到对主线程的 dispatch_async 调用,而不仅仅是一个 dispatch_sync。
是的。根据Apple开发者网站:
调度框架提供了一个默认的串行队列供应用程序使用。可以通过dispatch_get_main_queue()访问此队列。
man dispatch_main
,您会发现以下内容:“Cocoa应用程序不需要调用dispatch_main()。提交到主队列的块将作为应用程序主NSRunLoop或CFRunLoop的“公共模式”的一部分执行。但是,在使用dispatch_main()的应用程序中提交到主队列的块不能保证在主线程上执行。” - beOndispatch_async(dispatch_get_main_queue(), block)
调度的代码块将保证在主线程上执行。否则,该代码块可能会在任何线程上执行,这种说法并不完全正确。请注意,我已经尽力以最通俗易懂的方式翻译,并保持原意不变。 - CouchDeveloperdispatch_main()
时,dispatch_async(dispatch_get_main_queue(), ...)
没有在主线程上执行(一直如此)。然后,使用RunLoop,它在主线程上执行。dispatch的man页面也没有明确提到它会在主线程上执行:“dispatch框架为应用程序提供了一个默认的串行队列。该队列通过dispatch_get_main_queue()函数访问。” - CouchDeveloperman dispatch_main
说:“然而,在使用dispatch_main()的应用程序中提交到主队列的块不保证在主线程上执行。” - dmaclach