GCD的“全球队列”和“主队列”有什么区别?
在其他一些方法中,有两种方法可以在GCD
获得队列:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_get_main_queue();
如果我没有完全错误,主要的线程正在执行“主队列”,并且对于执行UI工作的“callback”块是有用的。
这是否意味着“全局队列”是在后台线程上运行的?
主队列的确可以像你说的那样在主线程上运行。
全局队列是并发队列,dispatch_get_global_queue的主页面是:
与使用dispatch_queue_create()分配的主队列或队列不同,只要线程可用,全局并发队列就会调度块(“非FIFO”完成顺序)。 全球并发队列代表三个优先级波段:
• DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW
提交给高优先级全局队列的块将在提交给默认或低优先级全局队列之前被调用。 提交给低优先级全局队列的块只有在默认或高优先级队列中没有挂起的块时才会被调用。
所以,它们是在后台线程可用时运行的队列。 他们是“非FIFO”,所以不能保证订购。
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和MacBook Pro上的模拟器上testing)
是。 你可以在设备上运行这样的代码来testing它:
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"); }); });
全球调度队列:
- 并发队列中的任务同时执行[后台线程]
- 任务仍按照添加到队列中的顺序启动
主调度队列:
- 可用的串行队列在应用程序的主线程上执行任务。
- 通常在后台处理完成后需要从后台队列中调用,需要更新用户界面。