????? 在iOS所有實(shí)現(xiàn)多線程的方案中鳄厌,GCD應(yīng)該是最有魅力的,因?yàn)镚CD本身是蘋果公司為多核的并行運(yùn)算提出的解決方案妈踊。GCD在工作時(shí)會(huì)自動(dòng)利用更多的處理器核心了嚎,以充分利用更強(qiáng)大的機(jī)器。GCD是Grand Central Dispatch的簡(jiǎn)稱廊营,它是基于C語(yǔ)言的歪泳。如果使用GCD,完全由系統(tǒng)管理線程赘风,我們不需要編寫線程代碼夹囚。只需定義想要執(zhí)行的任務(wù),然后添加到適當(dāng)?shù)恼{(diào)度隊(duì)列(dispatch queue)。GCD會(huì)負(fù)責(zé)創(chuàng)建線程和調(diào)度你的任務(wù)邀窃,系統(tǒng)直接提供線程管理
??? 使用GCD的時(shí)候有以下幾個(gè)步驟:
??? 一荸哟、創(chuàng)建任務(wù):確定要執(zhí)行什么操作
??? 二、創(chuàng)建隊(duì)列:將任務(wù)添加到隊(duì)列中? GCD會(huì)將隊(duì)列里的任務(wù)取出瞬捕,放到對(duì)應(yīng)的線程中去執(zhí)行
??? 三鞍历、選擇任務(wù)的執(zhí)行函數(shù):
1.同步的方式執(zhí)行函數(shù)
dispatch_sync(dispatch_queue_t queue, ^(void)block);
參數(shù)1:queue是對(duì)應(yīng)的隊(duì)列
參數(shù)2:block是對(duì)應(yīng)的執(zhí)行任務(wù)
2.異步的方式執(zhí)行函數(shù)
dispatch_async(dispatch_queue_t queue, ^(void)block);
參數(shù)1:隊(duì)列
參數(shù)2:對(duì)應(yīng)的任務(wù)
隊(duì)列有下面四種
*需要注意的是:主隊(duì)列中嚴(yán)禁提交同步任務(wù)? 會(huì)導(dǎo)致線程卡死? 導(dǎo)致界面假死
主隊(duì)列?? 不允許在主線程中提交同步任務(wù),否則會(huì)死循環(huán)?? 刷新UI的操作放到主隊(duì)列中執(zhí)行
dispatch_queue_t mainQueue = dispatch_get_main_queue();
同步狀態(tài):會(huì)卡死
異步狀態(tài):不會(huì)開(kāi)線程(會(huì)在線程閑下來(lái)的時(shí)候執(zhí)行提交的任務(wù))
//全局并發(fā)隊(duì)列
dispatch_queue_t globalQueue
=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
同步?狀態(tài):不會(huì)開(kāi)線程肪虎,順序執(zhí)行
異步狀態(tài):會(huì)開(kāi)線程劣砍,并且亂序執(zhí)行
//自定義串行
dispatch_queue_t serialQueue=dispatch_queue_create("abc", NULL);
同步狀態(tài):不開(kāi)線程,并且順序執(zhí)行
異步狀態(tài):開(kāi)一條線程扇救,順序執(zhí)行
//自定義的并行隊(duì)列
dispatch_queue_t ConcurrentQueue=dispatch_queue_create("abc", DISPATCH_QUEUE_CONCURRENT);
同步狀態(tài):不開(kāi)線程刑枝,順序執(zhí)行
異步狀態(tài):開(kāi)線程香嗓,亂序執(zhí)行(會(huì)開(kāi)多條線程)
如下方法?? 來(lái)做示例
-(void)threadCommunication{
//創(chuàng)建主隊(duì)列
dispatch_queue_t? mainQueue = dispatch_get_main_queue();
//創(chuàng)建全局并發(fā)隊(duì)列
dispatch_queue_t? globalQueue
=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//開(kāi)啟異步任務(wù)
dispatch_async(globalQueue, ^{
NSURL *url = [NSURL URLWithString:@"http://v1.qzone.cc/pic/201408/29/17/03/540041ff31605450.jpeg%21600x600.jpg"];
NSData *data= [NSData dataWithContentsOfURL:url];
NSLog(@"全局并發(fā)隊(duì)列=%@",[NSThread currentThread]);
??????? //開(kāi)啟第二個(gè)異步任務(wù)
???????? dispatch_async(mainQueue, ^{
????????? //這里刷UI《有好東西哦。你懂的》
????????? self.MyImageView.image=[UIImage imageWithData:data];
????????? NSLog(@"主隊(duì)列=%@",[NSThread currentThread]);
??????????? });
???? });
}