在其他一些方法中,有两种方法可以在GCD
中获取队列:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_main_queue();
如果我没有完全错误,“主队列”正在主线程上执行,并且适用于执行UI工作的“回调”块。
这是否意味着“全局队列”是在后台线程上运行的?
答案 0 :(得分:75)
主队列确实像你说的那样在主线程上运行。
全局队列是并发队列,并且来自dispatch_get_global_queue的主页:
与主要队列或分配的队列不同 dispatch_queue_create(),全局并发队列 线程一旦可用就调度块(“非FIFO”完成顺序)。全球并发 队列代表三个优先级带:
• DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW
提交给高优先级全局队列的块将在提交给它们之前被调用 默认或低优先级全局队列。提交到低优先级全局队列的块只会是 如果默认或高优先级队列中没有待处理的块,则调用此方法。
因此,它们是在后台线程上运行的队列,当它们可用时。它们是“非FIFO”,因此无法保证订购。
答案 1 :(得分:26)
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
(在iPod 4th gen和MacBook Pro上的模拟器上测试)
答案 2 :(得分:7)
是。您可以在设备上运行这样的代码来测试它:
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");
});
});
答案 3 :(得分:3)
全球调度队列:
主调度队列:
答案 4 :(得分:1)
GCD
包含三种主要的队列类型:
Main queue
:是使用主线程的串行队列。通常用于处理UI
Global queue
:作为并发队列,具有不同的优先级:高,默认,低和后台。
Custom queue
:您可以创建串行队列或并发队列