首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dispatch_async调入dispatch_async与dispatch_async调入dispatch_sync

dispatch_async调入dispatch_async与dispatch_async调入dispatch_sync
EN

Stack Overflow用户
提问于 2014-05-16 07:24:12
回答 2查看 203关注 0票数 1

我见过dispatch_async调用dispatch_async与dispatch_async调用dispatch_sync的常见习惯用法。

在某些情况下,可以用前者代替后者。问题是,在什么情况下,您只能使用其中一个而不能使用另一个?

代码语言:javascript
复制
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(), ^{
       //
    });
});
EN

回答 2

Stack Overflow用户

发布于 2014-05-16 07:42:46

只有当您在dispatch_async中有其他代码,并且希望在dispatch_sync中的代码完成后执行这些代码时,第二种选择才有意义。

代码语言:javascript
复制
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_syncdispatch_async作为内部调度也会产生同样的结果。

票数 1
EN

Stack Overflow用户

发布于 2014-05-16 07:46:55

我想说的是你应该努力避免阻塞线程。如果您想要使用dispatch_sync(),因为在转移到主线程的代码完成后有代码要运行,那么您应该改用“继续传递”编码方式。提交到主队列的任务应将新任务提交到并发队列。因此,代码可能如下所示:

代码语言:javascript
复制
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()调用,它不可能实现同步接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23690309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档