日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 雪柳花明 2016-03-14

1.設(shè)計思路

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


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

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

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


2.1.2連線監(jiān)聽imageview


2.1.3代碼

  1. //  htingViewController.h  
  2.   
  3. #import <UIKit/UIKit.h>  
  4.   
  5. @interface htingViewController : UIViewController  
  6.   
  7. @end  

  1. //  
  2. //  htingViewController.m  
  3.   
  4.   
  5. #import "htingViewController.h"  
  6.   
  7. @interface htingViewController ()  
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
  9. @property (nonatomic, strong) UIImage *image1;  
  10. @property (nonatomic, strong) UIImage *image2;  
  11. @end  
  12.   
  13. @implementation htingViewController  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     // Do any additional setup after loading the view, typically from a nib.  
  19. }  
  20.   
  21. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  22. {  
  23.     // 異步下載  
  24.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  25.         // 1.下載第1張  
  26.         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
  27.         NSData *data1 = [NSData dataWithContentsOfURL:url1];  
  28.         UIImage *image1 = [UIImage imageWithData:data1];  
  29.           
  30.         // 2.下載第2張  
  31.         NSURL *url2 = [NSURL URLWithString:@"http://su./static/superplus/img/logo_white_ee663702.png"];  
  32.         NSData *data2 = [NSData dataWithContentsOfURL:url2];  
  33.         UIImage *image2 = [UIImage imageWithData:data2];  
  34.           
  35.         // 3.合并圖片  
  36.         // 開啟一個位圖上下文  
  37.         UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
  38.           
  39.         // 繪制第1張圖片  
  40.         CGFloat image1W = image1.size.width;  
  41.         CGFloat image1H = image1.size.height;  
  42.         [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
  43.           
  44.         // 繪制第2張圖片  
  45.         CGFloat image2W = image2.size.width * 0.5;  
  46.         CGFloat image2H = image2.size.height * 0.5;  
  47.         CGFloat image2Y = image1H - image2H;  
  48.         [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
  49.           
  50.         // 得到上下文中的圖片  
  51.         UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
  52.           
  53.         // 結(jié)束上下文  
  54.         UIGraphicsEndImageContext();  
  55.           
  56.         // 4.回到主線程顯示圖片  
  57.         dispatch_async(dispatch_get_main_queue(), ^{  
  58.             self.imageView.image = fullImage;  
  59.         });  
  60.     });  
  61. }  
  62.   
  63.   
  64. @end  


2.1.4運行結(jié)果



2.2.方法二(由于上面的設(shè)計中下載圖片比較耗時,可以同事開啟兩個線程同事下載兩張圖片  )弊?。阂銉蓚€額外的屬性

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface htingViewController : UIViewController  
  4.   
  5. @end  

  1. //  
  2. //  htingViewController.m  
  3.   
  4.   
  5. #import "htingViewController.h"  
  6.   
  7. @interface htingViewController ()  
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
  9. @property (nonatomic, strong) UIImage *image1;  
  10. @property (nonatomic, strong) UIImage *image2;  
  11. @end  
  12.   
  13. @implementation htingViewController  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     // Do any additional setup after loading the view, typically from a nib.  
  19. }  
  20.   
  21. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  22. {  
  23.       
  24.     // 異步下載  
  25.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  26.         // 1.下載第1張  
  27.         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
  28.         NSData *data1 = [NSData dataWithContentsOfURL:url1];  
  29.         self.image1 = [UIImage imageWithData:data1];  
  30.           
  31.         [self bindImages];  
  32.     });  
  33.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  34.         // 2.下載第2張  
  35.         NSURL *url2 = [NSURL URLWithString:@"http://su./static/superplus/img/logo_white_ee663702.png"];  
  36.         NSData *data2 = [NSData dataWithContentsOfURL:url2];  
  37.         self.image2 = [UIImage imageWithData:data2];  
  38.           
  39.         [self bindImages];  
  40.     });  
  41.       
  42. }  
  43. - (void)bindImages  
  44. {  
  45.     if (self.image1 == nil || self.image2 == nil) return;  
  46.       
  47.     // 3.合并圖片  
  48.     // 開啟一個位圖上下文  (相當(dāng)于創(chuàng)建了一個空的圖片)  
  49.     // UIGraphicsBeginImageContextWithOptions(<#CGSize size#>(新的圖片有多大), <#BOOL opaque#>(NO代表透明,YES代表不透明), <#CGFloat scale#> (縮放比例))  
  50.     UIGraphicsBeginImageContextWithOptions(self.image1.size, NO, 0.0);  
  51.       
  52.     // 繪制第1張圖片 (繪制到上面創(chuàng)建的那個位圖上下文上面 也就是那張空的圖片上面)  
  53.     CGFloat image1W = self.image1.size.width;  
  54.     CGFloat image1H = self.image1.size.height;  
  55.     [self.image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
  56.       
  57.     // 繪制第2張圖片  
  58.     CGFloat image2W = self.image2.size.width * 0.5;  
  59.     CGFloat image2H = self.image2.size.height * 0.5;  
  60.     CGFloat image2Y = image1H - image2H;  
  61.     //把image2 繪制到后面的那個區(qū)域  
  62.     [self.image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
  63.       
  64.     // 得到上下文中的圖片  
  65.     UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
  66.       
  67.     // 結(jié)束上下文  
  68.     UIGraphicsEndImageContext();  
  69.       
  70.     // 4.回到主線程顯示圖片  
  71.     dispatch_async(dispatch_get_main_queue(), ^{  
  72.         self.imageView.image = fullImage;  
  73.     });  
  74. }  
  75.   
  76. @end  

2.3方法三 隊列組

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface htingViewController : UIViewController  
  4.   
  5. @end  

  1. //  
  2. //  htingViewController.m  
  3.   
  4.   
  5. #import "htingViewController.h"  
  6.   
  7. @interface htingViewController ()  
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
  9. //@property (nonatomic, strong) UIImage *image1;  
  10. //@property (nonatomic, strong) UIImage *image2;  
  11. @end  
  12.   
  13. @implementation htingViewController  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     // Do any additional setup after loading the view, typically from a nib.  
  19. }  
  20.   
  21. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  22. {  
  23.       
  24.     // 1.隊列組  
  25.     dispatch_group_t group = dispatch_group_create();  
  26.     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  27.       
  28.     // 2.下載圖片1  
  29.     __block UIImage *image1 = nil;  //要加一個 __block因為 block代碼默認(rèn)不能改外面的東西(記住語法即可)  
  30.     dispatch_group_async(group, queue, ^{  
  31.         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
  32.         NSData *data1 = [NSData dataWithContentsOfURL:url1];  
  33.         image1 = [UIImage imageWithData:data1];  
  34.     });  
  35.       
  36.     // 3.下載圖片2  
  37.     __block UIImage *image2 = nil;  
  38.     dispatch_group_async(group, queue, ^{  
  39.         NSURL *url2 = [NSURL URLWithString:@"http://su./static/superplus/img/logo_white_ee663702.png"];  
  40.         NSData *data2 = [NSData dataWithContentsOfURL:url2];  
  41.         image2 = [UIImage imageWithData:data2];  
  42.     });  
  43.       
  44.     // 4.合并圖片 用Quartz2D的知識,則要先要搞一個空的大圖片,然后再把小圖片畫上去(保證執(zhí)行完組里面的所有任務(wù)之后,再執(zhí)行notify函數(shù)里面的block)  
  45.     //隊列組:要把隊列組里面的所有任務(wù)都執(zhí)行完后調(diào)用dispatch_group_notify(group, queue, ^{ }  
  46.     dispatch_group_notify(group, queue, ^{  
  47.         // 開啟一個位圖上下文  
  48.         UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
  49.           
  50.         // 繪制第1張圖片  
  51.         CGFloat image1W = image1.size.width;  
  52.         CGFloat image1H = image1.size.height;  
  53.         [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
  54.           
  55.         // 繪制第2張圖片  
  56.         CGFloat image2W = image2.size.width * 0.5;  
  57.         CGFloat image2H = image2.size.height * 0.5;  
  58.         CGFloat image2Y = image1H - image2H;  
  59.         [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
  60.           
  61.         // 得到上下文中的圖片  
  62.         UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
  63.           
  64.         // 結(jié)束上下文  
  65.         UIGraphicsEndImageContext();  
  66.           
  67.         // 5.回到主線程顯示圖片  
  68.         dispatch_async(dispatch_get_main_queue(), ^{  
  69.             self.imageView.image = fullImage;  
  70.         });  
  71.     });  
  72.       
  73. }  
  74.   
  75. @end  


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多