03-隊列組 (瞭解)

来源:http://www.cnblogs.com/nxz-diy/archive/2016/04/07/5366016.html
-Advertisement-
Play Games

列出了隊列組的用法以及和隊列組同樣效果的實現方式;共三種實現方式。 ...


  1 #import "XZViewController.h"
  2 
  3 // 1.分別下載2張圖片:大圖片、LOGO
  4 // 2.合併2張圖片
  5 // 3.顯示到一個imageView身上
  6 
  7 @interface XZViewController ()
  8 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
  9 @property (nonatomic, strong) UIImage *image1;
 10 @property (nonatomic, strong) UIImage *image2;
 11 @end
 12 
 13 @implementation XZViewController
 14 
 15 - (void)viewDidLoad
 16 {
 17     [super viewDidLoad];
 18     
 19 }
 20 
 21 // 2D繪圖  Quartz2D
 22 // 合併圖片 -- 水印
 23 
 24 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 25 {   // 方法三
 26     // 1.隊列組
 27     dispatch_group_t group = dispatch_group_create();
 28     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 29     
 30     // 2.下載圖片1
 31     __block UIImage *image1 = nil;
 32     dispatch_group_async(group, queue, ^{
 33         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];
 34         NSData *data1 = [NSData dataWithContentsOfURL:url1];
 35         image1 = [UIImage imageWithData:data1];
 36     });
 37     
 38     // 3.下載圖片2
 39     __block UIImage *image2 = nil;
 40     dispatch_group_async(group, queue, ^{
 41         NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];
 42         NSData *data2 = [NSData dataWithContentsOfURL:url2];
 43         image2 = [UIImage imageWithData:data2];
 44     });
 45     
 46     // 4.合併圖片 (保證執行完組裡面的所有任務之後,再執行notify函數裡面的block)
 47     dispatch_group_notify(group, queue, ^{
 48         // 開啟一個點陣圖上下文
 49         UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);
 50         
 51         // 繪製第1張圖片
 52         CGFloat image1W = image1.size.width;
 53         CGFloat image1H = image1.size.height;
 54         [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
 55         
 56         // 繪製第2張圖片
 57         CGFloat image2W = image2.size.width * 0.5;
 58         CGFloat image2H = image2.size.height * 0.5;
 59         CGFloat image2Y = image1H - image2H;
 60         [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];
 61         
 62         // 得到上下文中的圖片
 63         UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
 64         
 65         // 結束上下文
 66         UIGraphicsEndImageContext();
 67         
 68         // 5.回到主線程顯示圖片
 69         dispatch_async(dispatch_get_main_queue(), ^{
 70             self.imageView.image = fullImage;
 71         });
 72     });
 73 }
 74 /** 方法二  */
 75 - (void)test2
 76 {
 77     // 非同步下載
 78     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 79         // 1.下載第1張
 80         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];
 81         NSData *data1 = [NSData dataWithContentsOfURL:url1];
 82         self.image1 = [UIImage imageWithData:data1];
 83         
 84         [self bindImages];
 85     });
 86     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 87         // 2.下載第2張
 88         NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];
 89         NSData *data2 = [NSData dataWithContentsOfURL:url2];
 90         self.image2 = [UIImage imageWithData:data2];
 91         
 92         [self bindImages];
 93     });
 94 }
 95 
 96 - (void)bindImages
 97 {
 98     if (self.image1 == nil || self.image2 == nil) return;
 99     
100     // 3.合併圖片
101     // 開啟一個點陣圖上下文
102     UIGraphicsBeginImageContextWithOptions(self.image1.size, NO, 0.0);
103     
104     // 繪製第1張圖片
105     CGFloat image1W = self.image1.size.width;
106     CGFloat image1H = self.image1.size.height;
107     [self.image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
108     
109     // 繪製第2張圖片
110     CGFloat image2W = self.image2.size.width * 0.5;
111     CGFloat image2H = self.image2.size.height * 0.5;
112     CGFloat image2Y = image1H - image2H;
113     [self.image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];
114     
115     // 得到上下文中的圖片
116     UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
117     
118     // 結束上下文
119     UIGraphicsEndImageContext();
120     
121     // 4.回到主線程顯示圖片
122     dispatch_async(dispatch_get_main_queue(), ^{
123         self.imageView.image = fullImage;
124     });
125 }
126 /** 方法一 */
127 - (void)test1
128 {
129     // 非同步下載
130     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
131         // 1.下載第1張
132         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];
133         NSData *data1 = [NSData dataWithContentsOfURL:url1];
134         UIImage *image1 = [UIImage imageWithData:data1];
135         
136         // 2.下載第2張
137         NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];
138         NSData *data2 = [NSData dataWithContentsOfURL:url2];
139         UIImage *image2 = [UIImage imageWithData:data2];
140         
141         // 3.合併圖片
142         // 開啟一個點陣圖上下文
143         UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);
144         
145         // 繪製第1張圖片
146         CGFloat image1W = image1.size.width;
147         CGFloat image1H = image1.size.height;
148         [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
149         
150         // 繪製第2張圖片
151         CGFloat image2W = image2.size.width * 0.5;
152         CGFloat image2H = image2.size.height * 0.5;
153         CGFloat image2Y = image1H - image2H;
154         [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];
155         
156         // 得到上下文中的圖片
157         UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
158         
159         // 結束上下文
160         UIGraphicsEndImageContext();
161         
162         // 4.回到主線程顯示圖片
163         dispatch_async(dispatch_get_main_queue(), ^{
164             self.imageView.image = fullImage;
165         });
166     });
167 }
168 
169 @end

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h RootViewController.m ...
  • 在iOS應用開發中,有三類視圖對象會打開虛擬鍵盤,進行輸入操作,但如何關閉虛擬鍵盤,卻沒有提供自動化的方法。這個需要我們自己去實現。這三類視圖對象分別是UITextField,UITextView和UISearchBar。 這裡介紹一下UITextField中關閉虛擬鍵盤的幾種方法。 (miki西游 ...
  • ​【聲明】 歡迎轉載,但請保留文章原始出處→_→ 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs.com/smyhvae/p/3981720.html 聯繫方式:[email protected] 【正文】 一、初識Git: Gi ...
  • 鍵盤的出現於隱藏(解決鍵盤彈出時會覆蓋文本框的問題,代碼實現) #import "ViewController.h" #import "UIView+FrameExtension.h" // 可以自己寫,以後用著方便 #define kDeviceHeight [UIScreen mainScree ...
  • 學習一門新語言最經典的例子就是輸出“Hello World!” 如果你使用過其他語言,那麼看上去是非常的熟悉吧。但比一些c要簡單的多吧 1、不需要導入一些單獨的庫,比如輸入/輸出或字元串處理功能的類庫, 2、不需要在全局範圍內編寫的代碼用於作為入口點程式,所以你不需要 main()函數, 3、不需要 ...
  • 前言:繼上次《IOS開發--微信支付》以來,一直沒有太多時間,更新總結詳細支付這樣的長篇大論,很抱歉。今天,推出支付寶支付的詳細流程。 1、開始下載和查看支付寶支付的Demo。 我們直接進入支付寶的支付平臺參考來進行集成支付寶支付: https://doc.open.alipay.com/doc2/ ...
  • [[XZMusicTool alloc] init]; [XZMusicTool sharedMusicTool]; [tool4 copy]; 以上三種方式都能保證創建出來的對象是同一個. ...
  • 上一節完成的自定義組合控制項,靈活性不夠,控制項的顯示信息上,仿照系統屬性,自定義自己的屬性 上一節組合控制項SettingItemView中有三個控制項,分別是TextView大標題,TextView描述,CheckBox覆選框 自定義屬性 tsh:title=”大標題” 和tsh:desc_on=”小標 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...