GCD中的“全局队列”和“主队列”之间有什么区别?

时间:2012-03-07 13:03:36

标签: iphone ios concurrency grand-central-dispatch

在其他一些方法中,有两种方法可以在GCD中获取队列:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

如果我没有完全错误,“主队列”正在主线程上执行,并且适用于执行UI工作的“回调”块。

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

5 个答案:

答案 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)

全球调度队列:

  1. 并发队列中的任务同时执行[后台主题]
  2. 任务仍按照添加到队列中的顺序启动
  3. 主调度队列:

    1. 可用的串行队列,用于在应用程序的主要任务上执行任务 线。
    2. 通常在某些时候从后台队列中调用它 后台处理已完成,用户界面需要 更新。

答案 4 :(得分:1)

GCD包含三种主要的队列类型:

Main queue:是使用主线程串行队列。通常用于处理UI

Global queue:作为并发队列,具有不同的优先级:高,默认,低和后台。

Custom queue:您可以创建串行队列或并发队列

[Read more here]