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

来源:互联网 发布:亚像素边缘提取算法 编辑:程序博客网 时间:2024/06/07 10:54

  • 多线程10CGD队列组图片下载合成示例
    • 一图示
    • 二分析
    • 三代码

多线程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
阅读全文
0 0
原创粉丝点击