ios 使用GCD下載多張圖片完成后合并成一張

同時下載多張圖片,下載完成后合成一張圖片。

核心代碼如下:

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();
    //關(guān)閉上下文
    UIGraphicsEndImageContext();
}];
}

pragma mark - 開啟任務(wù)隊列

 -(void)DownLoadImage:(void(^)(UIImage *image1,UIImage *image2,UIImage *image3))downLoadSuccess{

 __weak typeof(self) weakSelf = self;
// 創(chuàng)建分組
dispatch_group_t  group = dispatch_group_create();
// 創(chuàng)建隊列
dispatch_queue_t  queue = dispatch_queue_create("downLoadImage", DISPATCH_QUEUE_CONCURRENT);

// 往分組中添加任務(wù)1
// 請求依次執(zhí)行  與 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張圖片下載完成");
    
});

// 往分組中添加任務(wù)2
// 請求依次執(zhí)行  與 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張圖片下載完成");
    
});

// 往分組中添加任務(wù)3
// 請求依次執(zhí)行  與 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);
    
});

// 分組中任務(wù)完成后通知該block執(zhí)行
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

拓展:關(guān)于GCD的一些理解
1、GCD不需要我們來處理runLoop的運(yùn)行循環(huán),它是一套基于C的并發(fā)編程(但是強(qiáng)調(diào)一下GCD并不能理解為多線程,因?yàn)檫@個并不是自己來控制線程),我們在使用的時候是不需要管理線程的任何生命周期,系統(tǒng)會自動幫我們管理。在底層是有一個任務(wù)隊列與線程池的概念。
2、同步、異步

同步:表示在當(dāng)前線程(注意:不一定就表示主線程)執(zhí)行任務(wù),不去線程池中拿線程

異步:表示不在當(dāng)前線程執(zhí)行任務(wù),需要去線程池拿線程做處理

3、串行、并發(fā)

串行:表示所有任務(wù)一個接一個的在線程中執(zhí)行

并發(fā):表示所有任務(wù)可以同時在不同線程上執(zhí)行

粗略理解一下,同步,異步是用來表示是否需要去線程池中取線程,而串行、并發(fā)是用來表示怎么去任務(wù)隊列中取任務(wù)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容