1.簡(jiǎn)介
1.定義:Grand Central Dispatch 是異步執(zhí)行任務(wù)的技術(shù)之一鳞陨。
將線(xiàn)程管理的代碼在系統(tǒng)級(jí)實(shí)現(xiàn)。我們只需要定義任務(wù)并追加到適當(dāng)?shù)腄Ispath Queue中世蔗,GCD就能生成必要的線(xiàn)程并按計(jì)劃執(zhí)行任務(wù)。
2.相比于NSThread的優(yōu)勢(shì):
- 相比于NSThread的performSelector方法簡(jiǎn)潔
- 不必對(duì)線(xiàn)程進(jìn)行管理饮寞, 通過(guò)GCD提供的系統(tǒng)級(jí)線(xiàn)程管理提高了執(zhí)行效率张惹。
2.Dispatch Queue
1.Dispatch Queue 是執(zhí)行處理的等待隊(duì)列。
2.Dispatch Queue是隊(duì)列蝇更,按照追加的順序(先進(jìn)先出FIFO)執(zhí)行處理沪编。
3.在執(zhí)行處理時(shí),存在2中Dispatch Queue年扩。
串行隊(duì)列: 將任務(wù)添加到串行隊(duì)列中蚁廓,下一個(gè)任務(wù)會(huì)在上一個(gè)任務(wù)執(zhí)行完后再開(kāi)始執(zhí)行。系統(tǒng)對(duì)一個(gè)串行隊(duì)列只生成一個(gè)線(xiàn)程厨幻。
并發(fā)隊(duì)列:添加到并發(fā)隊(duì)列中的任務(wù)相嵌,會(huì)有多個(gè)任務(wù)同時(shí)在執(zhí)行。系統(tǒng)會(huì)根據(jù)當(dāng)前轉(zhuǎn)態(tài)况脆,生成多個(gè)線(xiàn)程饭宾。
3.隊(duì)列的生成和獲取
1.通過(guò)GCD來(lái)生成Dispatch Queue
//創(chuàng)建串行隊(duì)列
dispatch_queue_t serialQueue = dispatch_queue_create("com.weixiao.mySerialQueue",NULL);
//創(chuàng)建并發(fā)隊(duì)列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.weixiao.myConcreteQueue", DISPATCH_QUEUE_CONCURRENT);
第一個(gè)參數(shù)表示隊(duì)列的名稱(chēng)。
第二個(gè)參數(shù)為null表示創(chuàng)建的是串行隊(duì)列格了,DISPATCH_QUEUE_CONCURRENT表示并發(fā)隊(duì)列看铆。
當(dāng)創(chuàng)建很多個(gè)串行隊(duì)列的時(shí)候,每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)線(xiàn)程會(huì)造成內(nèi)存消耗過(guò)大盛末,引起大量的上下文切換弹惦,大幅度降低系統(tǒng)的響應(yīng)性能。
2.獲取系統(tǒng)提供的Dispatch Queue
// Main Queue
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
//Global Queue
dispatch_queue_t defaultGlobalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
主隊(duì)列是串行隊(duì)列悄但。追加到主隊(duì)中任務(wù)在主線(xiàn)程的Runloop中執(zhí)行棠隐。
global 隊(duì)列有4個(gè)執(zhí)行優(yōu)先級(jí)(high,default檐嚣,low助泽,background)。XNU內(nèi)核管理將global隊(duì)列的優(yōu)先級(jí)作為global隊(duì)列使用的的線(xiàn)程的優(yōu)先級(jí)。
4.dispatch_async和dispatch_sync
1.將任務(wù)添加到隊(duì)列有兩種函數(shù):
// 同步函數(shù)
dispatch_sync(queue,^{NSLog(@"black");});
//異步函數(shù)
dispatch_async(queue,^{NSLog(@"black");});
同步函數(shù)會(huì)等待添加到隊(duì)列中的任務(wù)執(zhí)行完畢才返回报咳, 會(huì)阻塞當(dāng)前線(xiàn)程侠讯。
異步函數(shù)不會(huì)等待添加到隊(duì)列中的任務(wù)執(zhí)行完畢,它會(huì)立即返回暑刃,不會(huì)阻塞當(dāng)前線(xiàn)程厢漩。
2.當(dāng)同步和異步函數(shù),串行和并發(fā)隊(duì)列組合岩臣,串行隊(duì)列情況:
// 1 serial, sync 打印1234
serialQueue.sync {
print(1)
}
print(2)
serialQueue.sync {
print(3)
}
print(4)
//2 serial, async 打印24 打印13 24 和13之間情況不定
serialQueue.async {
print(1)
}
print(2)
serialQueue.async {
print(3)
}
print(4)
//3 serial, sync in async 打印1 打印2 死鎖溜嗜。
print(1)
serialQueue.async {
print(2)
serialQueue.sync {
print(3)
}
print(4)
}
print(5)
//4 serial, async in sync // 打印1 打印24 打印5 3在2后,位置不定架谎。
print(1)
serialQueue.sync {
print(2)
serialQueue.async {
print(3)
}
print(4)
}
print(5)
并發(fā)隊(duì)列情況如下:
//1 concurrent, sync 打印1234
concurrentQueue.sync {
print(1)
}
print(2)
concurrentQueue.sync {
print(3)
}
print(4)
//2 concurrent, async 打印24 1和3 情況不定炸宵。
concurrentQueue.async {
print(1)
}
print(2)
concurrentQueue.async {
print(3)
}
print(4)
//3 concurrent, sync in async 打印15 打印234 234在1后,情況不定谷扣。
print(1)
concurrentQueue.async {
print(2)
concurrentQueue.sync {
print(3)
}
print(4)
}
print(5)
//4 concurrent, async in sync 打印1 打印24 打印5 3在2后情況不定土全。
print(1)
concurrentQueue.sync {
print(2)
concurrentQueue.async {
print(3)
}
print(4)
}
print(5)
- 會(huì)發(fā)生死鎖的情況是: 串行隊(duì)列中兩個(gè)任務(wù)相互等待。即在串行隊(duì)列A中会涎,又將任務(wù)同步的添加到A裹匙。