iOS学习笔记-111.多线程10——CGD队列组图片下载合成示例

时间:2023-01-23 16:42:35

多线程10——CGD队列组图片下载合成示例

一、图示

iOS学习笔记-111.多线程10——CGD队列组图片下载合成示例


二、分析

我们现在要干的事情是:下载两张图片,下载好了以后合成这两张图片。

事情的操作有先后顺序,我们可以使用栅栏函数和队列组。

这里面我们使用队列组。

分析过程:

  1. 我们开启两个子线程去下载两张图片(队列组异步函数)

  2. 下载完成后合并图片(可以放在 dispatch_group_notify 中执行)

  3. 合成完成以后,主线程更新UI(提交任务到主队列中)


三、代码

//
// QWMViewController4.m
// 03_UIview83多线程GCD
//
// Created by 杞文明 on 17/9/2.
// Copyright © 2017年 杞文明. All rights reserved.
// 图片合成

#import "QWMViewController4.h"

@interface QWMViewController4 ()
@property(nonatomic,strong)UIImageView *imageView1;
@property(nonatomic,strong)UIImageView *imageView2;
@property(nonatomic,strong)UIImageView *imageView3;
@property(nonatomic,strong)UIImage *image1;
@property(nonatomic,strong)UIImage *image2;
@end

@implementation QWMViewController4

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self createImageView];
}

/*创建UIImageView控件*/
-(void)createImageView{
//第一个资源图显示的ImageView
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 150, 150)];
//imageView.backgroundColor = [UIColor redColor];
self.imageView1 = imageView;
[self.view addSubview:imageView];

//第二个资源图片显示的资ImageView
imageView = [[UIImageView alloc]initWithFrame:CGRectMake(200, 20, 150, 150)];
//imageView.backgroundColor = [UIColor redColor];
self.imageView2 = imageView;
[self.view addSubview:imageView];

//合并以后显示的ImageView

imageView = [[UIImageView alloc]initWithFrame:CGRectMake(70, 200, 250, 500)];
//imageView.backgroundColor = [UIColor redColor];
self.imageView3 = imageView;
[self.view addSubview:imageView];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self mergeImage];
}

/*合并图片*/
-(void)mergeImage{
//1.获取队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

//2.创建队列组
dispatch_group_t group = dispatch_group_create();

//3.下载图片
//3.1下载第一个图片
dispatch_group_async(group, queue, ^{
NSString * path = @"https://image.3761.com/pic/9551399945974.png";
self.image1 = [self downLoadImage:path];
});
//3.2下载第二个图片
dispatch_group_async(group, queue, ^{
NSString * path = @"http://p.3761.com/pic/43701399945993.png";
self.image2 = [self downLoadImage:path];
});

//4.合并图片,只有上面的两个完成了才能进行这个步骤
dispatch_group_notify(group, queue, ^{
//4.1 创建图形上下文
UIGraphicsBeginImageContext(CGSizeMake(250, 500));

//4.2 画图1
[self.image1 drawInRect:CGRectMake(0, 0, 250, 250)];

//4.2 画图2
[self.image2 drawInRect:CGRectMake(0, 250, 250, 250)];

//加个水印
UIImage *wImage = [UIImage imageNamed:@"qiwenminglog"];
[wImage drawInRect:CGRectMake(0, 0, 250, 60)];
[wImage drawInRect:CGRectMake(0, 220, 250, 60)];
[wImage drawInRect:CGRectMake(0, 440, 250, 60)];

//4.4 根据上下文得到一张图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

//4.5关闭上下文
UIGraphicsEndImageContext();

//4.6 更新UI 主线程中
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView1.image = self.image1;
self.imageView2.image = self.image2;
self.imageView3.image = image;
self.image1 = nil;
self.image2 = nil;
});
});

}

/*下载图片数据*/
-(UIImage*)downLoadImage:(NSString*)path{
//1.获取URL
NSURL *url = [NSURL URLWithString:path];
//2.下载二进制数据
NSData *imageData = [NSData dataWithContentsOfURL:url];
//3.转换图片格式
return [[UIImage alloc]initWithData:imageData];
}

@end