1.gcd柵欄函數(shù)

2.gcd快速迭代方法(dispatch_apply)同for循環(huán)做比較。

案例:將文件夾from中的內(nèi)容剪切到文件夾to中。
//案例(gcd快速迭代)創(chuàng)建子線程的方法
-(void)movefilegcd{
//拿到文件目錄
NSString* from =@"/Users/wuyanan/Desktop/from";
//獲得目標(biāo)文件路徑
NSString* to =@"/Users/wuyanan/Desktop/to";
//得到目錄下的所有文件(返回的是數(shù)組)
NSArray* subPath = [[NSFileManagerdefaultManager]subpathsAtPath:from];
NSLog(@"wenjian----%@",subPath);
//遍歷所有文件,執(zhí)行剪切操作
NSIntegercount =[subPathcount];
dispatch_apply(count,dispatch_get_global_queue(0,0), ^(size_tindex) {
//4.1拼接文件的全路徑
//拼接的時候會自動添加/
NSString*fullpath =[fromstringByAppendingPathComponent:subPath[index]];
NSString* tofullpath =[tostringByAppendingPathComponent:subPath[index]];
NSLog(@"wenjian----%@",fullpath);
//4.2執(zhí)行剪切操作
/*
第一個參數(shù):源文件路徑,要剪切的文件的地址
第二個參數(shù):目標(biāo)文件路徑,文件應(yīng)該被放到的位置
第三個參數(shù):
*/
[[NSFileManagerdefaultManager]moveItemAtPath:fullpathtoPath:tofullpatherror:nil];
});
}
注意點(diǎn):

3.gcd隊(duì)列組
gcd的隊(duì)列組也可以控制順序。隊(duì)列組里面的隊(duì)列任務(wù)的執(zhí)行情況。當(dāng)任務(wù)都完成的時候發(fā)送通知。

案例2:下載兩張圖片,下載完成后合成一張圖片
-(void)group3
{
/*
1.下載圖片1開子線程
2.下載圖片2開子線程
3.合成圖片并顯示圖片開子線程
*/
//-1.獲得隊(duì)列組
dispatch_group_tgroup =dispatch_group_create();
//0.獲得并發(fā)隊(duì)列
dispatch_queue_tqueue =dispatch_get_global_queue(0,0);
// 1.下載圖片1開子線程
dispatch_group_async(group, queue,^{
NSLog(@"download1---%@",[NSThreadcurrentThread]);
//1.1確定url
NSURL*url = [NSURLURLWithString:@"http://www.qbaobei.com/tuku/images/13.jpg"];
//1.2下載二進(jìn)制數(shù)據(jù)
NSData*imageData = [NSDatadataWithContentsOfURL:url];
//1.3轉(zhuǎn)換圖片
self.image1= [UIImageimageWithData:imageData];
});
// 2.下載圖片2開子線程
dispatch_group_async(group, queue,^{
NSLog(@"download2---%@",[NSThreadcurrentThread]);
//2.1確定url
NSURL*url = [NSURLURLWithString:@"http://pic1a.nipic.com/2008-09-19/2008919134941443_2.jpg"];
//2.2下載二進(jìn)制數(shù)據(jù)
NSData*imageData = [NSDatadataWithContentsOfURL:url];
//2.3轉(zhuǎn)換圖片
self.image2= [UIImageimageWithData:imageData];
});
//3.合并圖片
//主線程中執(zhí)行
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"combie---%@",[NSThreadcurrentThread]);
//3.1創(chuàng)建圖形上下文
UIGraphicsBeginImageContext(CGSizeMake(200,200));
//3.2畫圖1
[self.image1drawInRect:CGRectMake(0,0,200,100)];
self.image1=nil;
//3.3畫圖2
[self.image2drawInRect:CGRectMake(0,100,200,100)];
self.image2=nil;
//3.4根據(jù)上下文得到一張圖片
UIImage*image =UIGraphicsGetImageFromCurrentImageContext();
//3.5關(guān)閉上下文
UIGraphicsEndImageContext();
//3.6更新UI
//dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"UI----%@",[NSThreadcurrentThread]);
self.imageView.image= image;
//});
});
}
使用creat函數(shù)創(chuàng)建的并發(fā)隊(duì)列和全局隊(duì)列的主要區(qū)別:
1.使用全局并發(fā)隊(duì)列在整個應(yīng)用程序中本身是默認(rèn)存在的,并且對應(yīng)有高優(yōu)先級、默認(rèn)優(yōu)先級,低優(yōu)先級和后臺優(yōu)先級一共四個并發(fā)隊(duì)列。我們只是選擇一個直接拿來用。而且create函數(shù)是實(shí)打?qū)嵉膹念^開始創(chuàng)建一個隊(duì)列。
2.在iOS6之前,在gcd中凡是使用了帶有create和retain的函數(shù),最后都需要做一次release操作。而主隊(duì)列和全局并發(fā)隊(duì)列不需要我們手動release。iOS6之后,不需要手動管理。
在使用柵欄函數(shù)的時候,蘋果官方規(guī)定只有柵欄函數(shù)只有在和使用creat函數(shù)自己創(chuàng)建的并發(fā)隊(duì)列一起使用的時候才有效
4.GCD補(bǔ)充
gcd開啟線程的兩種方法比較:
