一:GCD併發
全稱:Grand Central Dispatch(純C語言)異步
優點:async
1 GCD是謂多核的並行運算提出的解決方案函數
2 GCD會自動利用更多的CPU內核url
3 GCD會自動管理線程的生命週期(建立線程,調度任務,銷燬線程)spa
4 程序猿只須要告訴GCD想要執行的任務,不須要編寫代碼線程
二:核心概念code
1 任務 :執行生命操做orm
2,隊列:用來存聽任務生命週期
三:GCD使用的兩個步驟
1 定製任務:肯定想作的事
2 將任務添加到隊列:GCD會自動將隊列裏地任務取出,放到對應的線程中執行
四:執行任務
1 用同步的方式執行任務(只能在當前線程中執行任務,不具有開新線程的能力)
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
1>兩個參數
queue;隊列
block:任務
2 用異步的方法執行任務(能夠在新的線程中執行任務,具有開線程的能力)
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
五:隊列的類型(隊列只決定你的任務如何執行)
1 併發隊列(Concurrent Dispatch Queue)
能夠讓多個任務併發(同時)執行(自動開啓多個線程同時執行任務)
併發功能只能在異步中有效
* GCD默認已經提供了全局的併發隊列,供整個應用環境使用,不須要手動建立
//得到全局的併發隊列
dispatch_queue_t *queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 串行隊列(Serial Dispatch Queue)
讓任務一個接着一個的執行
*GCD中獲取串行隊列有兩種途徑
//1,dispatch_queue_create函數建立隊列
dispatch_queue_t *queues = dispatch_queue_create("puguanen.ecit.queue", NULL);
//使用主隊列(跟主線程相關的隊列)(用在線程之間通訊)
*主隊列是GCD自帶的一種特殊的串行隊列
*放在主隊列中的任務,都會放到主線程中執行(此時,將任務放到異步函數中執行時,異步失效)
六:延時執行
1,
// 3秒後自動開啓新線程 執行block中的代碼
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
NSLog(@"------task------%@", [NSThread currentThread]);
});
2,
// 一旦定製好延遲任務後,不會卡主當前線程
[self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:3];
七,一次性代碼
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
<#code to be executed once#>
});
代碼塊中的代碼只執行一次
八:代碼組
兩個(多個)個操做執行完以後再執行下一個操做
// 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;
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.合併圖片 (保證執行完組裏面的全部任務以後,再執行notify函數裏面的block)
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;
});
});