我见过dispatch_async调用dispatch_async与dispatch_async调用dispatch_sync的常见习惯用法。
在某些情况下,可以用前者代替后者。问题是,在什么情况下,您只能使用其中一个而不能使用另一个?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
//
});
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
//
});
});发布于 2014-05-16 07:42:46
只有当您在dispatch_async中有其他代码,并且希望在dispatch_sync中的代码完成后执行这些代码时,第二种选择才有意义。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// A) Some code here
dispatch_sync(dispatch_get_main_queue(), ^{
// B) some code here
});
// C) Some code here
});这确保执行A,然后是B(在主线程上),然后是C(在后台线程上,但在B代码完成之后)。
如果没有C代码,使用dispatch_sync或dispatch_async作为内部调度也会产生同样的结果。
发布于 2014-05-16 07:46:55
我想说的是你应该努力避免阻塞线程。如果您想要使用dispatch_sync(),因为在转移到主线程的代码完成后有代码要运行,那么您应该改用“继续传递”编码方式。提交到主队列的任务应将新任务提交到并发队列。因此,代码可能如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// A) Some code here
dispatch_async(dispatch_get_main_queue(), ^{
// B) some code here
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// C) Some code here
});
});
});使用dispatch_sync()的主要原因是当您正在实现一个固有的同步接口,但您需要将一个任务分派到一个队列来完成这一任务。通常只有在使用串行分派队列(或并发队列上的屏障任务)来保护共享资源时才会发生这种情况。
考虑到原始代码已经有一个dispatch_async()调用,它不可能实现同步接口。
https://stackoverflow.com/questions/23690309
复制相似问题