GCD的三種隊(duì)列類型
GCD的核心是dispatch隊(duì)列苍息。dispatch Block的執(zhí)行最終會(huì)放到某個(gè)隊(duì)列中去。
1. The main queen (主線程串行隊(duì)列)聪铺。通過(guò) dispatch_get_main_queen()獲取坠敷。
2.Global queen (全局并發(fā)隊(duì)列),通過(guò)dispatch_get_global_queen()獲取杈湾。全局并發(fā)隊(duì)列由全局共享,可以設(shè)置高攘须、中漆撞、低、后臺(tái)四個(gè)優(yōu)先級(jí)于宙。
3.Custom queen (自定義隊(duì)列)可以串行浮驳,也可以并發(fā)。通過(guò)dispatch_queen_create()獲取捞魁。
4.Group queen(隊(duì)列組)至会,將多線程分組,最大的好處獲知所有線程的執(zhí)行情況谱俭。通過(guò)dispatch_group_create()獲取奉件。通過(guò)dispatch_group_notify監(jiān)聽(tīng)線程的執(zhí)行情況宵蛀。
dispatch_sync同步執(zhí)行任務(wù)函數(shù),不會(huì)開(kāi)啟新的線程瓶蚂。dispatch_async異步執(zhí)行任務(wù)函數(shù)糖埋,會(huì)開(kāi)啟新的線程。
1.在主線程串行隊(duì)列中執(zhí)行同步任務(wù)會(huì)造成線程死鎖, block中的任務(wù)永遠(yuǎn)不會(huì)執(zhí)行窃这。因?yàn)閐ispatch_sync這個(gè)函數(shù)返回的時(shí)候主線程才會(huì)往下執(zhí)行瞳别,但這個(gè)函數(shù)的返回條件是里面的block返回,因?yàn)樗徊宓降搅酥骶€程串行隊(duì)列最后執(zhí)行杭攻,所以dispatch_sync無(wú)法返回祟敛,主線程串行隊(duì)列不會(huì)執(zhí)行到最后一個(gè),產(chǎn)生死鎖兆解。
dispatch_sync(mainQueen,^){
Nslog(@"mainQueen");
}
2.主線程串行隊(duì)列中執(zhí)行異步執(zhí)行任務(wù)不會(huì)造成死鎖馆铁。
dispatch_async(mainQueen,^){
Nslog(@"mainQueen");
}
3.從子線程異步返回主線程更新UI,使用方式最多
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
//子線程異步執(zhí)行下載任務(wù)锅睛,防止主線程卡頓
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
NSError *error;
NSString *htmlData = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (htmlData != nil) {
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//異步返回主線程埠巨,根據(jù)獲取的數(shù)據(jù),更新UI
dispatch_async(mainQueue, ^{
NSLog(@"根據(jù)更新UI界面");
});
} else {
NSLog(@"error when download:%@",error);
}
});
主線程串行隊(duì)列由系統(tǒng)默認(rèn)生成现拒,無(wú)法使用dispatch_resume()和diapatch_suspend()來(lái)控制執(zhí)行繼續(xù)或者中斷辣垒。
Global Queen(全局并發(fā)線程),耗時(shí)操作印蔬,例如讀取網(wǎng)絡(luò)數(shù)據(jù)勋桶、數(shù)據(jù)庫(kù)讀寫(xiě)、IO等侥猬。我們會(huì)在另一個(gè)線程中執(zhí)行此操作例驹,然后通知主線程刷新UI。
1.全局并發(fā)隊(duì)列同步執(zhí)行任務(wù)退唠,在主線程中執(zhí)行會(huì)導(dǎo)致頁(yè)面卡頓鹃锈。
dispatch_sync(globalQueen,^){
Nslog(@"globalQueen");
}
block中的代碼2s后才會(huì)執(zhí)行。
2.全局并發(fā)隊(duì)列異步執(zhí)行任務(wù)瞧预,在主線程中執(zhí)行不會(huì)造成頁(yè)面卡頓仪召。
dispatch_async(globalQueen,^){
Nslog(@"globalQueen");
}
3.多個(gè)全局并發(fā)隊(duì)列,異步執(zhí)行任務(wù)
dispatch_async(globalQueen,^){
Nslog(@"老大");
}
dispatch_async(globalQueen,^){
Nslog(@"老二");
}
異步線程的執(zhí)行順序是不確定的松蒜。幾乎同步開(kāi)始執(zhí)行
全局并發(fā)隊(duì)列由系統(tǒng)默認(rèn)生成的,所以無(wú)法調(diào)用dispatch_resume()和dispatch_suspend()來(lái)控制執(zhí)行繼續(xù)或中斷已旧。