美文网首页春天来咯iOS开发知识小集iOS开发技能集锦
ios 使用GCD下载多张图片完成后合并成一张

ios 使用GCD下载多张图片完成后合并成一张

作者: 画舫烟中浅 | 来源:发表于2019-03-18 10:07 被阅读49次

    同时下载多张图片,下载完成后合成一张图片。

    核心代码如下:

    pragma mark - 合并图片并显示

    - (void)viewDidLoad {
       [super viewDidLoad];
       [self DownLoadImage:^(UIImage *image1, UIImage *image2, UIImage *image3) {
        //合并
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(375, 450), NO, 0.0);
        [image1 drawInRect:CGRectMake(0, 0, 375, 150)];
        [image2 drawInRect:CGRectMake(0, 150, 375, 150)];
        [image3 drawInRect:CGRectMake(0, 300, 375, 150)];
       //给ImageView赋值
        self.downImageV.image = UIGraphicsGetImageFromCurrentImageContext();
        //关闭上下文
        UIGraphicsEndImageContext();
    }];
    }
    

    pragma mark - 开启任务队列

     -(void)DownLoadImage:(void(^)(UIImage *image1,UIImage *image2,UIImage *image3))downLoadSuccess{
    
     __weak typeof(self) weakSelf = self;
    // 创建分组
    dispatch_group_t  group = dispatch_group_create();
    // 创建队列
    dispatch_queue_t  queue = dispatch_queue_create("downLoadImage", DISPATCH_QUEUE_CONCURRENT);
    
    // 往分组中添加任务1
    // 请求依次执行  与 dispatch_group_leave 配对使用
    dispatch_group_enter(group);
    __block UIImage *image1 = nil;
    dispatch_group_async(group, queue, ^{
         NSLog(@"第1张图片开始下载");
       //处理耗时的操作
        image1 = [weakSelf imageWithUrl:@"http://img0.imgtn.bdimg.com/it/u=3272199364,3404297250&fm=26&gp=0.jpg"];
        dispatch_group_leave(group);
         NSLog(@"第1张图片下载完成");
        
    });
    
    // 往分组中添加任务2
    // 请求依次执行  与 dispatch_group_leave 配对使用
    dispatch_group_enter(group);
     __block UIImage *image2 = nil;
    dispatch_group_async(group, queue, ^{
         NSLog(@"第2张图片开始下载");
        //处理耗时的操作
        image2 = [weakSelf imageWithUrl:@"http://img.redocn.com/200906/2/321782_124390997641aY.jpg"];
        dispatch_group_leave(group);
        NSLog(@"第2张图片下载完成");
        
    });
    
    // 往分组中添加任务3
    // 请求依次执行  与 dispatch_group_leave 配对使用
    dispatch_group_enter(group);
     __block UIImage *image3 = nil;
    dispatch_group_async(group, queue, ^{
         NSLog(@"第3张图片开始下载");
        //处理耗时的操作
        image3 = [weakSelf imageWithUrl:@"http://img5.imgtn.bdimg.com/it/u=2083600987,3767582702&fm=26&gp=0.jpg"];
        
        NSLog(@"第3张图片下载完成");
        dispatch_group_leave(group);
        
    });
    
    // 分组中任务完成后通知该block执行
    dispatch_group_notify(group, queue, ^{
       
        dispatch_async(dispatch_get_main_queue(), ^{
            // 通知主线程刷新UI
            downLoadSuccess(image1,image2,image3);
        });
    });
    }
    

    pragma mark - 下载图片

    - (UIImage *) imageWithUrl :(NSString *) urlStr{
          NSURL *url = [NSURL URLWithString:urlStr];
          NSData *data = [NSData dataWithContentsOfURL:url];
          return [UIImage imageWithData:data];
    }
    

    pragma mark - 显示效果

    屏幕快照 2019-03-18 上午10.04.07.png

    拓展:关于GCD的一些理解
    1、GCD不需要我们来处理runLoop的运行循环,它是一套基于C的并发编程(但是强调一下GCD并不能理解为多线程,因为这个并不是自己来控制线程),我们在使用的时候是不需要管理线程的任何生命周期,系统会自动帮我们管理。在底层是有一个任务队列与线程池的概念。
    2、同步、异步

    同步:表示在当前线程(注意:不一定就表示主线程)执行任务,不去线程池中拿线程

    异步:表示不在当前线程执行任务,需要去线程池拿线程做处理

    3、串行、并发

    串行:表示所有任务一个接一个的在线程中执行

    并发:表示所有任务可以同时在不同线程上执行

    粗略理解一下,同步,异步是用来表示是否需要去线程池中取线程,而串行、并发是用来表示怎么去任务队列中取任务的。

    相关文章

      网友评论

        本文标题:ios 使用GCD下载多张图片完成后合并成一张

        本文链接:https://www.haomeiwen.com/subject/aimmmqtx.html