美文网首页
串行队列使用 dispatch_async & dispatch

串行队列使用 dispatch_async & dispatch

作者: tom__zhu | 来源:发表于2021-01-12 22:49 被阅读0次

Q:串行队列可以保证任务会依次顺序执行,那么使用 dispatch_async 与 dispatch_sync 有什么不同?
Answer:唯一的区别是dispatch_sync只有在任务执行结束后才会return,然后dispatch_async会在任务放入队列中后立即return。
例如此代码:

dispatch_async(serialQueue, ^{
  log("1");
});
log("2");
dispatch_async(serialQueue, ^{
  log("3");
});
log("4");

可能会输出2413或者1234,不过1永远在3之前。
再看这段代码:

dispatch_sync(serialQueue, ^{
  log("1");
});
log("2");
dispatch_sync(serialQueue, ^{
  log("3");
});
log("4");

输出永远都是1234,原因是因为dispatch_sync(serialQueue,task)只会在task结束后才返回,("3")任务是在log("2")执行之后分发的,且一个任务只能在它被分发之后才能执行。


接下来把问题更贴近实际。
例如下面的代码:

-(void) dealloc {
  dispatch_async(serialQueue, ^{
    [self clearConnection];
  });
}

-(void) clearConnection {
   // clear operation
  self.delegate = nil;
  ……
}

这样写会报错,因为dispatch_async不会等task结束就return,接着dealloc执行结束释放资源,之后执行clearConnection操作时会因为找不到self.delegate而报错。

Difference between dispatch_async and dispatch_sync on serial queue?

相关文章

网友评论

      本文标题:串行队列使用 dispatch_async & dispatch

      本文链接:https://www.haomeiwen.com/subject/nnfyaktx.html