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?
网友评论