iOS-GCD队列组的使用

- (void)group1{
    
    //获取全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //创建一个并发队列
    dispatch_queue_t queue1 = dispatch_queue_create("peiDuo", DISPATCH_QUEUE_CONCURRENT);
    
    //创建队列组
    dispatch_group_t group = dispatch_group_create();
    
    /**
     创建一个异步函数
     1./用block封装任务 添加到队列中
     2./开启子线程并发执行封装的任务
    dispatch_async(queue, ^{
        NSLog(@"任务 1 :%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务 2 :%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务 3 :%@",[NSThread currentThread]);
    });
     */
    
    /**
     创建一个异步函数
     1./用block封装任务 添加到队列中
     2./开启子线程并发执行封装的任务
     3./监听同一队列组中的任务,全部执行完成后会进入对应的方法
     参数
     1./队列组
     2./队列
     3./封装的任务
     */
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务 1 :%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务 2 :%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, queue1, ^{
        NSLog(@"任务 3 :%@",[NSThread currentThread]);
    });
    
    /**
     拦截通知
     当队列组中的任务都执行完成后会进入这个方法 该方法本身是异步的,不会阻塞线程.
     参数
     1./要拦截的队列组
     2./拦截任务在哪个队列中执行(可以是主队列,起到线程间通信的作用)
     3./拦截后执行的任务
     */
    dispatch_group_notify(group, queue, ^{
        NSLog(@"--end--%@",[NSThread currentThread]);
    });
}
- (void)group2{
    
    //获取全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    //创建队列组
    dispatch_group_t group = dispatch_group_create();
    
    //开始群组,在该方法后面的异步函数都会进入群组 有进入就要有离开,两个函数必须成对使用
    dispatch_group_enter(group);
    
    //异步并行
    dispatch_async(queue, ^{
        NSLog(@"任务 1 :%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务 2 :%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务 3 :%@",[NSThread currentThread]);
        
        //离开群组 
        dispatch_group_leave(group);
    });
    
    //拦截通知
    /**
    dispatch_group_notify(group, queue, ^{
        NSLog(@"队列组内任务完成了 : %@",[NSThread currentThread]);
    });
     */
    
    /**
     第二种拦截方法
     参数
     1./队列组
     2./时间 现在 DISPATCH_TIME_NOW 还是 未来 DISPATCH_TIME_FOREVER 如果传现在不会起到拦截作用,会马上执行
     未来:它会等到队列组中的所有任务都执行完成后才会触发.也能起到监听队列组的效果
     这个方法时阻塞的,队列组内任务不执行完成,下面的代码永远不会执行.
     */
    dispatch_group_wait(group,  DISPATCH_TIME_FOREVER);
    
    NSLog(@"--验证--");
}

队列组的实际应用

//图片一
@property (nonatomic , strong) UIImage * image1;
//图片二
@property (nonatomic , strong) UIImage * image2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
- (void)group3{

    // 创建组队列

    dispatch_group_tgroup = dispatch_group_create();

      // 下载图片,添加到队列组中执行

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSURL*url = [NSURLURLWithString:@"[https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1523902227523&di=474686c26c7a7d2b815305dd45f0e046&imgtype=0&src=http%3A%2F%2Fcdnq.duitang.com%2Fuploads%2Fitem%2F201504%2F30%2F20150430125352_aeTLk.jpeg](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1523902227523&di=474686c26c7a7d2b815305dd45f0e046&imgtype=0&src=http%3A%2F%2Fcdnq.duitang.com%2Fuploads%2Fitem%2F201504%2F30%2F20150430125352_aeTLk.jpeg)"];

        NSData*data = [NSDatadataWithContentsOfURL:url];

        self.image1= [UIImageimageWithData:data];

    });

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSURL*url = [NSURLURLWithString:@"[https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1523902227523&di=10ebfe2bc365465b65f1bc81692c7b18&imgtype=0&src=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%2F201512%2F10%2F20151210140032_dncWK.jpeg](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1523902227523&di=10ebfe2bc365465b65f1bc81692c7b18&imgtype=0&src=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%2F201512%2F10%2F20151210140032_dncWK.jpeg)"];

        NSData*data = [NSDatadataWithContentsOfURL:url];

        self.image2= [UIImageimageWithData:data];

    });

    // 合成图片,队列中的任务执行完后,执行这段代码

    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // 开启新的图形上下文 定义合成后的尺寸

        UIGraphicsBeginImageContext(CGSizeMake(200, 400));

        // 绘制图片

        [self.image1drawInRect:CGRectMake(0, 0, 200, 200)];

        [self.image2drawInRect:CGRectMake(0, 200, 200, 200)];

        // 取得上下文中的图片

        UIImage*image = UIGraphicsGetImageFromCurrentImageContext();

        //清空

        self.image1= nil;

        self.image2= nil;

        // 结束上下文

        UIGraphicsEndImageContext();

        // 回到主线程显示图片

        dispatch_async(dispatch_get_main_queue(), ^{

            // 4.将新图片显示出来

            self.imageView.image= image;

        });

    });

    /**

     在MRC中需要手动释放队列和队列组

     GCD中带有create创建关键字的都需要手动释放

     dispatch_release(group);

     */

}

你可能感兴趣的:(iOS-GCD队列组的使用)