GCD 中的“全局队列”和“主队列”有啥区别?
Posted
技术标签:
【中文标题】GCD 中的“全局队列”和“主队列”有啥区别?【英文标题】:What's the difference between the "global queue" and the "main queue" in GCD?GCD 中的“全局队列”和“主队列”有什么区别? 【发布时间】:2012-03-25 00:20:22 【问题描述】:在其他一些方式中,有这两种方式来获取GCD
中的队列:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_main_queue();
如果我没有完全错,“主队列”是在主线程上执行的,对执行 UI 工作的“回调”块很有用。
这是否意味着“全局队列”是在后台线程上运行的?
【问题讨论】:
【参考方案1】:主队列确实像你说的那样在主线程上运行。
全局队列是并发队列,来自dispatch_get_global_queue的主页:
与主队列或分配的队列不同 dispatch_queue_create(),全局并发队列 一旦线程可用(“非 FIFO”完成顺序)就安排块。全球并发 队列代表三个优先级:
• DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW
提交到高优先级全局队列的块将在那些提交到 默认或低优先级全局队列。提交到低优先级全局队列的块只会被 如果默认或高优先级队列上没有待处理的块,则调用。
因此,它们是在可用时在后台线程上运行的队列。它们是“非先进先出”,因此无法保证订购。
【讨论】:
说全局队列是并发队列并且不能创建自己的并发队列(使用dispatch_queue_create
或其他)是否正确?
请参考“非 FIFO”?【参考方案2】:
5 个队列(4 个后台,1 个主)也都有不同的线程优先级(-[NSThread threadPriority]
):
-main- : 0.758065
DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000
(在第 4 代 iPod 和 MacBook Pro 上的模拟器上测试)
【讨论】:
【参考方案3】:是的。你可以在设备上运行这样的代码来测试它:
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
NSLog(@"Block 1a");
NSAssert(![NSThread isMainThread], @"Wrong thread!");
NSLog(@"Block 1b");
);
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
dispatch_async(dispatch_get_main_queue(), ^
NSLog(@"Block 2a");
NSAssert([NSThread isMainThread], @"Wrong thread!");
NSLog(@"Block 2b");
);
);
【讨论】:
【参考方案4】:全局调度队列:
-
并发队列中的任务同时执行 [后台线程]
任务仍按照添加到队列中的顺序启动
主调度队列:
-
在应用程序的主线程上执行任务的可用串行队列
线。
通常在某些情况下从后台队列调用
后台处理已完成,用户界面需要
更新。
【讨论】:
以上是关于GCD 中的“全局队列”和“主队列”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章