如何同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)

GCD:
使用Dispatch Group追加block到Global Group Queue,这些block如果全部执行完毕,就会执行Main Dispatch Queue中的结束处理的block。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加载图片1 / });
dispatch_group_async(group, queue, ^{ /
加载图片2 / });
dispatch_group_async(group, queue, ^{ /
加载图片3 */ });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合并图片
});

需要注意的:dispatch_group_wait是同步的所以不能放在主线程执行。
补充: dispatch_group会等和它关联的所有的dispatch_queue_t上的任务都执行完毕才会发出同步信号(dispathc_group_notify的代码块block会被执行,group_wait会结束等待)。也就是说一个group可以关联多个任务队列;下面给出示例:

  • (void)groupSync2
    {
    dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
    sleep(5);
    NSLog(@"任务一完成");
    });
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
    sleep(6);
    NSLog(@"任务二完成");
    });
    dispatch_group_async(dispatchGroup, globalQueue, ^{
    sleep(10);
    NSLog(@"任务三完成");
    });
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
    NSLog(@"notify:任务都完成了");
    });
    }
    NSOperation:
    // 创建队列
    NSOperationQueue *queue1 = [[NSOperationQueue alloc] init];
    // 添加操作
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"download1----%@", [NSThread currentThread]);
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"download2----%@", [NSThread currentThread]);
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"download3----%@", [NSThread currentThread]);
    }];
    // 设置依赖(保证op3在op1和op2都执行完之后再执行)
    [op3 addDependency:op1];
    [op3 addDependency:op2];
    [op1 start];
    [op2 start];
    [op3 start];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 4,288评论 0 3
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 3,754评论 0 0
  • 欢迎大家指出文章中需要改正或者需要补充的地方,我会及时更新,非常感谢。 一. 多线程基础 1. 进程 进程是指在系...
    xx_cc阅读 12,006评论 11 70
  • 1. GCD简介 什么是GCD呢?我们先来看看百度百科的解释简单了解下概念 引自百度百科:Grand Centra...
    千寻_544f阅读 3,085评论 0 0
  • 项目需要做一个下拉框,根据选择内容的不同,加载不同的视图,在安卓开发工具里有现成的工具 spinner,直接拿来用...
    我叫山鸡_阅读 3,237评论 2 2