2012-03-07 58 views
48

在一些其他的方式,有在GCD是这两种方式来获得队列:GCD中的“全局队列”和“主队列”有什么区别?

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_get_main_queue(); 

如果我不是完全错误的,“主队列”的主线程上执行,也是很好的“回调“执行UI工作的块。

这是否意味着“全球队列”是一个在后台线程上运行?

回答

66

主队列像你说的确实在主线程上运行。

全球队列是并发的队列和从dispatch_get_global_queue主页:

不像 dispatch_queue_create(分配的主队列或队列),全球并发队列 调度块尽快线程变得可用(“非FIFO”完成顺序)。全球并发 队列代表三个优先乐队:

 • DISPATCH_QUEUE_PRIORITY_HIGH 
     • DISPATCH_QUEUE_PRIORITY_DEFAULT 
     • DISPATCH_QUEUE_PRIORITY_LOW 

块提交给高优先级的全局队列会提交 默认或低优先级队列全球前那些被调用。提交给低优先级全局队列的块只有在默认或高优先级队列上没有挂起的块时才会调用 。

因此,它们是在后台线程可用时运行的队列。他们是“非FIFO”,所以订购不保证。

+0

说全球队列是并发队列,你不能创建自己的并发队列(使用'dispatch_queue_create'或其他)吗? – 2016-04-28 04:30:40

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"); 
       }); 
     }); 
21

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上的模拟器)

1

全球调度队列:在并发队列前

  1. 任务ecutes同时[后台线程]
  2. 任务依然顺序开始,他们添加到队列

主要调度队列:

上执行任务
  1. 可用串行队列中的应用程序的主 线。
  2. 它通常是从背景队列调用时一些 后台处理已经完成和用户接口需要 被更新。