任务组实现,可以监听多线程的状态,任务组的任务全部完成后,在去实现其它任务例如,给用户发送全部下载完成通知,以及修改UI
#import "ViewController.h"
//宏定义全局并发队列
#define global_quque dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
//宏定义主队列
#define main_queue dispatch_get_main_queue()
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView3;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self demo4];
}
#pragma mark - 改用任务组2简写
- (void)demo4
{
dispatch_async(global_quque, ^{
dispatch_group_t group = dispatch_group_create();
//下载图片1
__block UIImage *image1;
dispatch_group_async(group, global_quque, ^{
image1= [self imageWithUrl:@"http://d.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a12172df5e0fefa1581533d095fcd/cefc1e178a82b9019115de3d738da9773912ef00.jpg"];
NSLog(@"图片1下载完成---%@",[NSThread currentThread]);
});
//下载图片2
__block UIImage *image2;
dispatch_group_async(group, global_quque, ^{
image2= [self imageWithUrl:@"http://h.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56f6635b2b/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];
NSLog(@"图片2下载完成---%@",[NSThread currentThread]);
});
//当group中的任务全部完成回到主线程设置UI
dispatch_group_notify(group, main_queue, ^{
NSLog(@"显示图片---%@",[NSThread currentThread]);
self.imageView1.image=image1;
self.imageView2.image=image2;
//合并两张图片
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);
[image1 drawInRect:CGRectMake(0, 0, 100, 100)];
[image2 drawInRect:CGRectMake(100, 0, 100, 100)];
self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
NSLog(@"图片合并完成---%@",[NSThread currentThread]);
});
});
}
#pragma mark - 改用任务组1
- (void)demo3
{
dispatch_async(global_quque, ^{
dispatch_group_t group = dispatch_group_create();
//下载图片1
__block UIImage *image1;
dispatch_group_enter(group);
dispatch_async(global_quque, ^{
image1= [self imageWithUrl:@"http://d.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a12172df5e0fefa1581533d095fcd/cefc1e178a82b9019115de3d738da9773912ef00.jpg"];
NSLog(@"图片1下载完成---%@",[NSThread currentThread]);
dispatch_group_leave(group);
});
//下载图片2
__block UIImage *image2;
dispatch_group_enter(group);
dispatch_async(global_quque, ^{
image2= [self imageWithUrl:@"http://h.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56f6635b2b/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];
NSLog(@"图片2下载完成---%@",[NSThread currentThread]);
dispatch_group_leave(group);
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
//回到主线程显示图片
dispatch_async(main_queue, ^{
NSLog(@"显示图片---%@",[NSThread currentThread]);
self.imageView1.image=image1;
self.imageView2.image=image2;
//合并两张图片
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);
[image1 drawInRect:CGRectMake(0, 0, 100, 100)];
[image2 drawInRect:CGRectMake(100, 0, 100, 100)];
self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
NSLog(@"图片合并完成---%@",[NSThread currentThread]);
});
//
});
}
#pragma mark - 并行异步下载图片,没用线程组
- (void)demo2
{
dispatch_async(global_quque, ^{
//下载图片1
__block UIImage *image1;
dispatch_async(global_quque, ^{
image1= [self imageWithUrl:@"http://d.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a12172df5e0fefa1581533d095fcd/cefc1e178a82b9019115de3d738da9773912ef00.jpg"];
NSLog(@"图片1下载完成---%@",[NSThread currentThread]);
});
//下载图片2
__block UIImage *image2;
dispatch_async(global_quque, ^{
image2= [self imageWithUrl:@"http://h.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56f6635b2b/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];
NSLog(@"图片2下载完成---%@",[NSThread currentThread]);
});
//回到主线程显示图片
dispatch_async(main_queue, ^{
NSLog(@"显示图片---%@",[NSThread currentThread]);
self.imageView1.image=image1;
self.imageView2.image=image2;
//合并两张图片
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);
[image1 drawInRect:CGRectMake(0, 0, 100, 100)];
[image2 drawInRect:CGRectMake(100, 0, 100, 100)];
self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
NSLog(@"图片合并完成---%@",[NSThread currentThread]);
});
//
});
}
//封装一个方法,传入一个url参数,返回一张网络上下载的图片
-(UIImage *)imageWithUrl:(NSString *)urlStr
{
NSURL *url=[NSURL URLWithString:urlStr];
NSData *data=[NSData dataWithContentsOfURL:url];
UIImage *image=[UIImage imageWithData:data];
return image;
}
@end