在Grand Central Dispatch中使用串行队列的dispatch_async与dispatch_sync
好的,我喜欢Grand Central Dispatch,使用之后相对成功,但这是我不完全了解的。
假设我已经创build了我自己的串行队列
dispatch_queue_t myQueue; myQueue = dispatch_queue_create("myQueue", NULL);
之后,我这样做:
dispatch_async(myQueue, ^{ [self doStuff1]; }); // and a few lines later... dispatch_sync(myQueue, ^{ [self doStuff2]; });
第一次调度是asynchronous的。 所以,这将同时完成,对吧? 那么如果myQueue是连续的呢? 一个串行队列如何并行地执行或者如果你会不按顺序执行?
谢谢
dispatch_async()
意味着块被排队, dispatch_async()
返回在块被执行之前排队另一个任务/块(可能)。
使用dispatch_sync()
,块将被排队,并且该函数将不会继续排队另一个任务/块,直到该块被执行。
这些块仍然是连续执行的。 你可以执行100次dispatch_async()
调用,每次调用一个可以hibernate100秒的块,而且速度非常快。 然后在相同的串行队列上调用dispatch_sync()
, dispatch_sync()
将在〜10,000秒之后返回。
简单来说:
dispatch_async(serialQ, block1); dispatch_async(serialQ, block2); dispatch_sync(serialQ, block3);
block1
将在block2
之前执行, block2
将在block3
之前执行。 这是串行队列保证的顺序。
但是,调用dispatch_async()
可能会在任何块开始执行之前返回。 dispatch_sync()
在所有三个块被执行之前不会返回!
dispatch_async
或dispatch_sync
都不会改变块排队的方式。 如果队列是串行的,则这些块将以串行方式执行,如果队列并发,则以并行方式执行。
两者之间的重要区别在于dispatch_sync
将该块排队,并在当前执行线程上等待,直到该块被执行,并且dispatch_async
将该块排队并继续执行后续指令。