我学到了一些关于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秒,但事实并非如此。相反,障碍与其他任务并行执行,尽管有障碍,所有任务都会立即执行。文档是错误的还是我误解了一些东西?提前致谢
答案 0 :(得分:2)
您似乎误读了文档中的下一段
您指定的队列应该是您创建的并发队列 你自己使用dispatch_queue_create函数。如果排队你 传递给这个函数是一个串行队列或全局的一个 并发队列,此函数的行为类似于dispatch_async 功能
即
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
不会成为障碍,而是普通的dispatch_async