美文网首页
iOS 多线程之dispatch_group

iOS 多线程之dispatch_group

作者: 枫叶无处漂泊 | 来源:发表于2019-12-12 17:54 被阅读0次

前言

在开发app的时候,难免会遇到这样的需求:当你需要异步请求两个接口,必须两个两个接口完成才能刷新界面。在例如要请求三张图片的接口,然后把三张请求完的图片合成一张图。这个时候就需要用到dispatch_group队列组。

dispatch_group 队列组


//DISPATCH_QUEUE_CONCURRENT创建并发队列
//    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    //这个方法也可以,创建并发队列
    dispatch_queue_t globalQue = dispatch_get_global_queue(0, 0);
   
    dispatch_group_async(group, globalQue, ^{
        
        sleep(1);
        NSLog(@"休眠1s 执行任务");
    });
    
    dispatch_group_async(group, globalQue, ^{
        
        sleep(2);
        NSLog(@"休眠2s 执行任务");
    });
    
    dispatch_group_async(group, globalQue, ^{
        
        sleep(3);
        NSLog(@"休眠3秒 执行任务");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        
        //前三组是并行执行的,3s后这三个线程都执行完毕,会执行done
        NSLog(@"done");
    });

多次执行,打印结果:

休眠1s 执行任务
休眠2s 执行任务
休眠3秒 执行任务
done

只有当三个任务都执行完毕,才会执行dispatch_group_notify这个方法,做一些处理。

dispatch_group_wait 暂停当前线程

暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。

下面用代码来演示一下:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t globalQue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, globalQue, ^{
              
    sleep(1);
    NSLog(@"休眠1s 执行任务");
 });
          
dispatch_group_async(group, globalQue, ^{
              
    sleep(2);
    NSLog(@"休眠2s 执行任务");
});

// 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"end");
}

多次执行结果都会发现打印end都是最后执行。

休眠1s 执行任务
休眠2s 执行任务
end

当所有任务执行完成之后,才执行 dispatch_group_wait 之后的操作。但是,使用dispatch_group_wait 会阻塞当前线程。

dispatch_group_enter/dispatch_group_leave

这种方式用在不使用dispatch_group_async来提交任务,且必须配合使用.相当于dispatch_group_async.

休眠1s 执行任务
休眠2s 执行任务
done

个人任务和内存管理的引用计数类似,我们可以认为group也持有一个整形变量(只是假设),当调用enter时计数加1,调用leave时计数减1,当计数为0时会调用dispatch_group_notify并且dispatch_group_wait会停止等待;

相关文章

网友评论

      本文标题:iOS 多线程之dispatch_group

      本文链接:https://www.haomeiwen.com/subject/zfitnctx.html