新任务不等待GCD障碍

时间:2016-10-20 05:09:04

标签: ios objective-c grand-central-dispatch

我学到了一些关于GCD障碍的知识,并希望检查这些信息(来自Apple docs):

  

屏障块之后提交的任何块都不会执行,直到屏障块完成。

通过此代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (int i = 0; i < 500, i++) {
  dispatch_async(queue, ^{
    NSLog("%d", i);
  }
  if ((i % 50) == 0) {
    dispatch_barrier_async(queue, ^{
      for (int j = 0; j < 5; j++) {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"Barrier!");
      }
    });
  }
}

我原本期待每50个计数,队列将停止5秒,但事实并非如此。相反,障碍与其他任务并行执行,尽管有障碍,所有任务都会立即执行。文档是错误的还是我误解了一些东西?提前致谢

1 个答案:

答案 0 :(得分:2)

您似乎误读了文档中的下一段

  

您指定的队列应该是您创建的并发队列   你自己使用dispatch_queue_create函数。如果排队你   传递给这个函数是一个串行队列或全局的一个   并发队列,此函数的行为类似于dispatch_async   功能

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

不会成为障碍,而是普通的dispatch_async