- (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);
*/
}