前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >block与GCD--44:Dispatch Group

block与GCD--44:Dispatch Group

作者头像
xy_ss
发布2023-11-22 08:31:37
1210
发布2023-11-22 08:31:37
举报
文章被收录于专栏:浮躁的喧嚣浮躁的喧嚣

dispatch_group是GCD(Grand Central Dispatch)中的一组方法,他有一个组的概念,可以把相关的任务归并到一个组内来执行,通过监听组内所有任务的执行情况来做相应处理

dispatch_group有以下几种方法

创建dispatch_group

代码语言:javascript
复制
dispatch_group_t group = dispatch_group_create();

把异步任务提交到指定dispatch_group

代码语言:javascript
复制
  dispatch_group_async(dispatch_group_t group,
                        dispatch_queue_t queue,
                        dispatch_block_t block);
  • group:对应的任务组
  • queue:block任务执行的线程队列,任务组内不同任务的队列可以不同
  • block:执行任务的block

使分组里面正要执行的任务数递增或递减(有增必有减,俩者要对应),如果调用了enter之后,没有相应leace操作,那么这一组永远执行不完

代码语言:javascript
复制
   void dispatch_group_enter(dispatch_group_t group);
   void dispatch_group_leave(dispatch_group_t group);

等待组任务完成,会阻塞当前线程,当任务组执行完毕时,才会解除阻塞当前线程

代码语言:javascript
复制
 dispatch_group_wait(dispatch_group_t group,  dispatch_time_t timeout);
  • group:需要等待的任务组
  • timeout:单位为dispatch_time_t。表示函数在等待dispatch_group执行完毕时,应该阻塞多久,如果小于timeout,返回0,否则返回非0。如果设置为DISPATCH_TIME_FOREVER,则会一直等待(阻塞当前线程),直到任务组执行完毕,不会超时

待任务组执行完毕时调用,不会阻塞当前线程

代码语言:javascript
复制
  void dispatch_group_notify(dispatch_group_t group,
                         dispatch_queue_t queue, 
                         dispatch_block_t block);
  • group ——需要监听的任务组
  • queue ——block任务执行的线程队列,和之前group执行的线程队列无关
  • block ——任务组执行完毕时需要执行的任务block
代码语言:javascript
复制
- (IBAction)queueGroup:(id)sender {
    
    //创建一个队列
    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, ^{
        NSLog(@"download image1 start");
        //下载图片1
        NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        self.image1 =[UIImage imageWithData:data];
        NSLog(@"download image1 end");

    });

    dispatch_group_async(group, queue, ^{
        NSLog(@"download image2 start");

        //下载图片2
        NSURL *url = [NSURL URLWithString:@"http://pic38.nipic.com/20140228/5571398_215900721128_2.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        self.image2 =[UIImage imageWithData:data];
        
        NSLog(@"download image2 end");

    });
    
    //当这个队列组的所有队列全部完成,就会收到这个消息
    dispatch_group_notify(group, queue, ^{
        
        NSLog(@"download all images");
        
        //合成新图片
        UIGraphicsBeginImageContext(CGSizeMake(100, 100));
        [self.image1 drawInRect:CGRectMake(0, 0, 50, 100)];
        [self.image2 drawInRect:CGRectMake(50, 0, 50, 100)];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        //在主线程显示
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
        });
    });
}

快速遍历

  • 主要用于并发队列
代码语言:javascript
复制
dispatch_apply(size_t iterations, dispatch_queue_t queue,
        DISPATCH_NOESCAPE void (^block)(size_t))
  • iterations:指定重复次数
  • queue:block任务执行的线程队列
  • size_t:index的作用是为了按执行的顺序区分各个Block
代码语言:javascript
复制
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(10, queue, ^(size_t index) {
        NSLog(@"%@--%zu",[NSThread currentThread],index);
    });
NSLog(@"done");
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • dispatch_group有以下几种方法
  • 快速遍历
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档