dispatch_async调用dispatch_async vs dispatch_async调用dispatch_sync

时间:2014-05-15 23:24:12

标签: objective-c grand-central-dispatch

我见过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(), ^{
       //
    });
});

2 个答案:

答案 0 :(得分:1)

第二个选项只有在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_syncdispatch_async作为内部调度结果。

答案 1 :(得分:1)

我会说你应该努力避免阻塞线程。如果您想尝试使用dispatch_sync(),因为在您正在分流到主线程的内容之后运行代码,您应该使用"继续传递&#34 ;编码风格。您提交到主队列的任务应该向并发队列提交新任务。因此,代码可能如下所示:

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()调用,它无法实现同步接口。