iOS開發(fā)多線程之隊列組——下載合并圖片

轉載自iOS開發(fā)多線程之隊列組——下載合并圖片

1. 設計思路

要合并兩張圖片浇垦,用Quartz2D的知識组橄,則要先要搞一個空的大圖片,然后再把兩張小圖片畫到那張大圖片上面

圖片.png

2. 實現(由一般實現再過度到隊列組)

2.1 方法一(先下載第1張圖片叶撒,然后下載第2張圖片紊搪,最后合并圖片)弊病:由于圖片比較耗時田柔,一張一張的下載圖片更耗時俐巴。

2.1.1 首先創(chuàng)建一個project,然后拖一個imageview

圖片.png

2.1.2 連線監(jiān)聽imageview

圖片.png

2.1.3 代碼

//  htingViewController.h  
  
#import <UIKit/UIKit.h>  
  
@interface htingViewController : UIViewController  
  
@end  

    //  
    //  htingViewController.m  
      
      
    #import "htingViewController.h"  
      
    @interface htingViewController ()  
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
    @property (nonatomic, strong) UIImage *image1;  
    @property (nonatomic, strong) UIImage *image2;  
    @end  
      
    @implementation htingViewController  
      
    - (void)viewDidLoad  
    {  
        [super viewDidLoad];  
        // Do any additional setup after loading the view, typically from a nib.  
    }  
      
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
    {  
        // 異步下載  
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
            // 1.下載第1張  
            NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
            NSData *data1 = [NSData dataWithContentsOfURL:url1];  
            UIImage *image1 = [UIImage imageWithData:data1];  
              
            // 2.下載第2張  
            NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
            NSData *data2 = [NSData dataWithContentsOfURL:url2];  
            UIImage *image2 = [UIImage imageWithData:data2];  
              
            // 3.合并圖片  
            // 開啟一個位圖上下文  
            UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
              
            // 繪制第1張圖片  
            CGFloat image1W = image1.size.width;  
            CGFloat image1H = image1.size.height;  
            [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
              
            // 繪制第2張圖片  
            CGFloat image2W = image2.size.width * 0.5;  
            CGFloat image2H = image2.size.height * 0.5;  
            CGFloat image2Y = image1H - image2H;  
            [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
              
            // 得到上下文中的圖片  
            UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
              
            // 結束上下文  
            UIGraphicsEndImageContext();  
              
            // 4.回到主線程顯示圖片  
            dispatch_async(dispatch_get_main_queue(), ^{  
                self.imageView.image = fullImage;  
            });  
        });  
    }  
      
      
    @end  


2.1.4 運行結果

圖片.png

2.2. 方法二(由于上面的設計中下載圖片比較耗時硬爆,可以同事開啟兩個線程同事下載兩張圖片 )弊残蓝妗:要搞兩個額外的屬性

    #import <UIKit/UIKit.h>  
      
    @interface htingViewController : UIViewController  
      
    @end  
    //  
    //  htingViewController.m  
      
      
    #import "htingViewController.h"  
      
    @interface htingViewController ()  
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
    @property (nonatomic, strong) UIImage *image1;  
    @property (nonatomic, strong) UIImage *image2;  
    @end  
      
    @implementation htingViewController  
      
    - (void)viewDidLoad  
    {  
        [super viewDidLoad];  
        // Do any additional setup after loading the view, typically from a nib.  
    }  
      
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
    {  
          
        // 異步下載  
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
            // 1.下載第1張  
            NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
            NSData *data1 = [NSData dataWithContentsOfURL:url1];  
            self.image1 = [UIImage imageWithData:data1];  
              
            [self bindImages];  
        });  
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
            // 2.下載第2張  
            NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
            NSData *data2 = [NSData dataWithContentsOfURL:url2];  
            self.image2 = [UIImage imageWithData:data2];  
              
            [self bindImages];  
        });  
          
    }  
    - (void)bindImages  
    {  
        if (self.image1 == nil || self.image2 == nil) return;  
          
        // 3.合并圖片  
        // 開啟一個位圖上下文  (相當于創(chuàng)建了一個空的圖片)  
        // UIGraphicsBeginImageContextWithOptions(<#CGSize size#>(新的圖片有多大), <#BOOL opaque#>(NO代表透明,YES代表不透明), <#CGFloat scale#> (縮放比例))  
        UIGraphicsBeginImageContextWithOptions(self.image1.size, NO, 0.0);  
          
        // 繪制第1張圖片 (繪制到上面創(chuàng)建的那個位圖上下文上面 也就是那張空的圖片上面)  
        CGFloat image1W = self.image1.size.width;  
        CGFloat image1H = self.image1.size.height;  
        [self.image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
          
        // 繪制第2張圖片  
        CGFloat image2W = self.image2.size.width * 0.5;  
        CGFloat image2H = self.image2.size.height * 0.5;  
        CGFloat image2Y = image1H - image2H;  
        //把image2 繪制到后面的那個區(qū)域  
        [self.image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
          
        // 得到上下文中的圖片  
        UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
          
        // 結束上下文  
        UIGraphicsEndImageContext();  
          
        // 4.回到主線程顯示圖片  
        dispatch_async(dispatch_get_main_queue(), ^{  
            self.imageView.image = fullImage;  
        });  
    }  
      
    @end  

2.3 方法三 隊列組

    #import <UIKit/UIKit.h>  
      
    @interface htingViewController : UIViewController  
      
    @end  
    //  
    //  htingViewController.m  
      
      
    #import "htingViewController.h"  
      
    @interface htingViewController ()  
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
    //@property (nonatomic, strong) UIImage *image1;  
    //@property (nonatomic, strong) UIImage *image2;  
    @end  
      
    @implementation htingViewController  
      
    - (void)viewDidLoad  
    {  
        [super viewDidLoad];  
        // Do any additional setup after loading the view, typically from a nib.  
    }  
      
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
    {  
          
        // 1.隊列組  
        dispatch_group_t group = dispatch_group_create();  
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
          
        // 2.下載圖片1  
        __block UIImage *image1 = nil;  //要加一個 __block因為 block代碼默認不能改外面的東西(記住語法即可)  
        dispatch_group_async(group, queue, ^{  
            NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
            NSData *data1 = [NSData dataWithContentsOfURL:url1];  
            image1 = [UIImage imageWithData:data1];  
        });  
          
        // 3.下載圖片2  
        __block UIImage *image2 = nil;  
        dispatch_group_async(group, queue, ^{  
            NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
            NSData *data2 = [NSData dataWithContentsOfURL:url2];  
            image2 = [UIImage imageWithData:data2];  
        });  
          
        // 4.合并圖片 用Quartz2D的知識缀磕,則要先要搞一個空的大圖片缘圈,然后再把小圖片畫上去(保證執(zhí)行完組里面的所有任務之后,再執(zhí)行notify函數里面的block)  
        //隊列組:要把隊列組里面的所有任務都執(zhí)行完后調用dispatch_group_notify(group, queue, ^{ }  
        dispatch_group_notify(group, queue, ^{  
            // 開啟一個位圖上下文  
            UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
              
            // 繪制第1張圖片  
            CGFloat image1W = image1.size.width;  
            CGFloat image1H = image1.size.height;  
            [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
              
            // 繪制第2張圖片  
            CGFloat image2W = image2.size.width * 0.5;  
            CGFloat image2H = image2.size.height * 0.5;  
            CGFloat image2Y = image1H - image2H;  
            [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
              
            // 得到上下文中的圖片  
            UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
              
            // 結束上下文  
            UIGraphicsEndImageContext();  
              
            // 5.回到主線程顯示圖片  
            dispatch_async(dispatch_get_main_queue(), ^{  
                self.imageView.image = fullImage;  
            });  
        });  
          
    }  
      
    @end  
圖片.png

-**

  • 隊列組
    不知道是否正確袜蚕,看到就載過來糟把,供大家參考
圖片.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牲剃,隨后出現的幾起案子遣疯,更是在濱河造成了極大的恐慌,老刑警劉巖凿傅,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缠犀,死亡現場離奇詭異数苫,居然都是意外死亡,警方通過查閱死者的電腦和手機辨液,發(fā)現死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門文判,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人室梅,你說我怎么就攤上這事戏仓。” “怎么了亡鼠?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵赏殃,是天一觀的道長。 經常有香客問我间涵,道長仁热,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任勾哩,我火速辦了婚禮抗蠢,結果婚禮上,老公的妹妹穿的比我還像新娘思劳。我一直安慰自己迅矛,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布潜叛。 她就那樣靜靜地躺著秽褒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪威兜。 梳的紋絲不亂的頭發(fā)上销斟,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音椒舵,去河邊找鬼蚂踊。 笑死,一個胖子當著我的面吹牛笔宿,可吹牛的內容都是我干的犁钟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼措伐,長吁一口氣:“原來是場噩夢啊……” “哼特纤!你這毒婦竟也來了?” 一聲冷哼從身側響起侥加,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捧存,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體昔穴,經...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡镰官,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了吗货。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泳唠。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宙搬,靈堂內的尸體忽然破棺而出笨腥,到底是詐尸還是另有隱情,我是刑警寧澤勇垛,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布脖母,位于F島的核電站,受9級特大地震影響闲孤,放射性物質發(fā)生泄漏谆级。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一讼积、第九天 我趴在偏房一處隱蔽的房頂上張望肥照。 院中可真熱鬧,春花似錦勤众、人聲如沸舆绎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亿蒸。三九已至,卻和暖如春掌桩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姑食。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工波岛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音半。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘲碱。 傳聞我的和親對象是個殘疾皇子累奈,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容