在Grand Central Dispatch中使用串行队列的dispatch_async与dispatch_sync

Spa*_*Dog 24 iphone objective-c grand-central-dispatch ios

好的,我喜欢Grand Central Dispatch并且在使用它之后相对成功,但这是我不完全理解的.

假设我已经创建了自己的串行队列

dispatch_queue_t myQueue;
myQueue = dispatch_queue_create("myQueue", NULL);
Run Code Online (Sandbox Code Playgroud)

之后我这样做:

dispatch_async(myQueue, ^{
  [self doStuff1];
});

// and a few lines later...

dispatch_sync(myQueue, ^{
  [self doStuff2];
});
Run Code Online (Sandbox Code Playgroud)

第一个调度是异步的.那么,它将同时完成,对吧?如果myQueue是串行的怎么办?串行队列如何并行执行,或者如果不按顺序执行?

谢谢

bbu*_*bum 58

dispatch_async()表示该块已入dispatch_async()队并返回以在执行该块之前将另一个任务/块(可能)排入队列.

使用时dispatch_sync(),该块将入队,并且该函数将不会继续将另一个任务/块排入队列,直到执行该块为止.

这些块仍然是串行执行的.你可以执行100个dispatch_async()调用,每个调用都有一个睡眠时间为100秒的块,而且它真的很快.通过调用dispatch_sync()相同的串行队列来执行此操作,并在dispatch_sync()10,000秒后返回.


更简单地说:

dispatch_async(serialQ, block1);
dispatch_async(serialQ, block2);
dispatch_sync(serialQ, block3);
Run Code Online (Sandbox Code Playgroud)

block1将在之前block2执行之前执行block3.这是串行队列保证的顺序.

但是,调用dispatch_async()可能会任何块开始执行之前返回.在dispatch_sync()被执行所有三个块之前恢复!

  • @asma22异步调度的整点是将块排队并立即返回.如果块在串行队列中排队,则可能需要几分钟才能执行.异步调度专门将入队与执行分离. (2认同)