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

多线程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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值