dispatch_group是GCD(Grand Central Dispatch)中的一组方法,他有一个组的概念,可以把相关的任务归并到一个组内来执行,通过监听组内所有任务的执行情况来做相应处理
创建dispatch_group
dispatch_group_t group = dispatch_group_create();
把异步任务提交到指定dispatch_group
dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
使分组里面正要执行的任务数递增或递减(有增必有减,俩者要对应),如果调用了enter之后,没有相应leace操作,那么这一组永远执行不完
void dispatch_group_enter(dispatch_group_t group);
void dispatch_group_leave(dispatch_group_t group);
等待组任务完成,会阻塞当前线程,当任务组执行完毕时,才会解除阻塞当前线程
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
待任务组执行完毕时调用,不会阻塞当前线程
void dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
- (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;
});
});
}
dispatch_apply(size_t iterations, dispatch_queue_t queue,
DISPATCH_NOESCAPE void (^block)(size_t))
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");