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

在使用 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

https://stackoverflow.com/questions/11909629/

相关文章:

ios - 动态改变UILabel的字体大小

objective-c - Objective-C 中的方法语法

ios - 在没有 UITableViewController 的情况下拉取刷新 UITableVi

ios - 尝试将非属性列表对象设置为 NSUserDefaults

ios - 具有 UITapGestureRecognizer 的 View 中的 UIButton

objective-c - 项目构建中的 CocoaPods 错误

ios - 从 UIView 到 UIViewController?

ios - 在 Objective-C 中检查空字符串的正确方法是什么?

objective-c - Objective-C 中的 NULL 与 nil

ios - iOS 7+ 中的 Base64 解码