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

Pro*_*ber 56 iphone concurrency grand-central-dispatch ios

在其他一些方面,有以下两种方式来获取队列GCD:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();
Run Code Online (Sandbox Code Playgroud)

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

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

mat*_*way 77

主队列确实像你说的那样在主线程上运行.

全局队列是并发队列,并且来自dispatch_get_global_queue的主页面:

与使用dispatch_queue_create()分配的主队列或队列不同,一旦线程可用,全局并发队列就会调度块("非FIFO"完成顺序).全局并发队列代表三个优先级带:

       •   DISPATCH_QUEUE_PRIORITY_HIGH
       •   DISPATCH_QUEUE_PRIORITY_DEFAULT
       •   DISPATCH_QUEUE_PRIORITY_LOW
Run Code Online (Sandbox Code Playgroud)

提交到高优先级全局队列的块将在提交到默认或低优先级全局队列的块之前调用.只有在默认或高优先级队列中没有待处理的块时,才会调用提交到低优先级全局队列的块.

因此,它们是在后台线程上运行的队列,当它们可用时.它们是"非FIFO",因此无法保证订购.


jjr*_*ott 27

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
Run Code Online (Sandbox Code Playgroud)

(在iPod 4th gen和MacBook Pro上的模拟器上测试过)


Grz*_*icz 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");
                });
        });
Run Code Online (Sandbox Code Playgroud)


Lyj*_*son 5

全局调度队列:

  1. 并发队列中的任务并发执行[后台线程]
  2. 任务仍按添加到队列的顺序启动

主调度队列:

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