ios - 等到两个异步 block 被执行后再开始另一个 block

标签 ios objective-c objective-c-blocks grand-central-dispatch

在使用 GCD 时,我们希望等到两个异步 block 执行完毕后再继续执行下一步。最好的方法是什么?

我们尝试了以下方法,但似乎不起作用:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block1
});


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block2
});

// wait until both the block1 and block2 are done before start block3
// how to do that?

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block3
});

最佳答案

使用调度组:见 here例如,Apple 的 iOS 开发人员库的并发编程指南的“调度队列”一章中的“等待队列任务组”

您的示例可能如下所示:

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block1
    NSLog(@"Block1");
    [NSThread sleepForTimeInterval:5.0];
    NSLog(@"Block1 End");
});


dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block2
    NSLog(@"Block2");
    [NSThread sleepForTimeInterval:8.0];
    NSLog(@"Block2 End");
});

dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block3
    NSLog(@"Block3");
});

// only for non-ARC projects, handled automatically in ARC-enabled projects.
dispatch_release(group);

并且可以产生这样的输出:

2012-08-11 16:10:18.049 Dispatch[11858:1e03] Block1
2012-08-11 16:10:18.052 Dispatch[11858:1d03] Block2
2012-08-11 16:10:23.051 Dispatch[11858:1e03] Block1 End
2012-08-11 16:10:26.053 Dispatch[11858:1d03] Block2 End
2012-08-11 16:10:26.054 Dispatch[11858:1d03] Block3

关于ios - 等到两个异步 block 被执行后再开始另一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909629/

相关文章:

ios - UICollectionView 滚动问题

c++ - 将第 3 方 C++ 库添加到 Objective-C 项目中

objective-c - 无法在 AVPlayer 中播放 mp4 视频

ios - __block 没有 block 的存储类型?

objective-c - block 可以通过 Objective C 中的协议(protocol)替换委托(delegate)模式吗?

ios - Firemonkey在iOS中不显示希伯来文字

ios - 按钮和 anchor 标记悬停和事件在 Iphone 的 Chrome 上不起作用

ios - 将函数传递给完成处理程序

ios - 如何处理长文本UILabel

ios - 你如何从 Objective C 中的一个 block 返回