本文主在記錄GCD的簡單使用贸典,更多高級使用請參考文后鏈接。
工具:Xcode
GCD使用分為兩部分,任務(wù)分發(fā)和添加到隊(duì)列
任務(wù)分發(fā)
任務(wù)分發(fā)分同步分發(fā)和異步分發(fā)一罩,同步分發(fā)會(huì)阻塞當(dāng)前線程,直到任務(wù)分發(fā)并執(zhí)行完成撇簿,在主線程中聂渊;異步分發(fā)不會(huì)阻塞線程,可以異步分發(fā)任務(wù)并異步執(zhí)行四瘫,不影響下面的代碼執(zhí)行汉嗽,異步分發(fā)到主隊(duì)列不開啟新線程,異步分發(fā)到全局隊(duì)列會(huì)開啟新線程找蜜。
同步分發(fā)任務(wù)
dispatch_sync(dispatch_queue_t _Nonnull queue, ^{
//code
});
異步分發(fā)任務(wù)
dispatch_async(dispatch_queue_t _Nonnull queue, ^{
//code
});
添加到隊(duì)列(Dispatch Queue)
隊(duì)列(Dispatch Queue)是一個(gè)任務(wù)執(zhí)行隊(duì)列饼暑,可以讓你異步或同步地執(zhí)行多個(gè)Block或函數(shù)。Dispatch Queue是FIFO的洗做,即先入隊(duì)的任務(wù)總會(huì)先執(zhí)行弓叛。目前有三種類型的Dispath Queue:
- 串行隊(duì)列 (Serial dispatch queue)
- 并行隊(duì)列 (Concurrent dispatch queue)
- 主隊(duì)列 (Main dispatch queue)
串行隊(duì)列
串行隊(duì)列一次只能處理一個(gè)任務(wù),可以由用戶調(diào)用dispatch_queue_create創(chuàng)建:
dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue", NULL);
并行隊(duì)列
并行隊(duì)列可以同時(shí)處理多個(gè)任務(wù)诚纸,在不得以的情況下可以用dispatch_queue_create創(chuàng)建撰筷,但一般我們都要用系統(tǒng)預(yù)定義的并行隊(duì)列,即全局隊(duì)列(Global Concurrent Dispatch Queues)畦徘。目前系統(tǒng)預(yù)定義了四個(gè)不同運(yùn)行優(yōu)先級的全局隊(duì)列毕籽,我們可以通過dispatch_get_global_queue來獲取它們。
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_global_queue第一個(gè)參數(shù)是隊(duì)列的優(yōu)先級旧烧,分別對應(yīng)四個(gè)全局隊(duì)列:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
第二個(gè)參數(shù)是系統(tǒng)預(yù)保留參數(shù)影钉,設(shè)為0即可。
主隊(duì)列
主隊(duì)列是一個(gè)特殊的隊(duì)列掘剪,它是系統(tǒng)預(yù)定義的運(yùn)行在主線程的一個(gè)Dispatch Queue平委。可以通過dispatch_get_main_queue來獲取唯一的主隊(duì)列夺谁。主隊(duì)列一般運(yùn)行一些需要與主線程同步的一些短時(shí)任務(wù)廉赔。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
隊(duì)列與任務(wù)的結(jié)合
函數(shù) | 全局并發(fā)隊(duì)列 | 手動(dòng)創(chuàng)建串行隊(duì)列 | 主隊(duì)列 |
---|---|---|---|
同步(sync) | 沒有開啟新線程 串行執(zhí)行任務(wù) | 沒有開啟新線程 串行執(zhí)行任務(wù) | 沒有開啟新線程 串行執(zhí)行任務(wù) |
異步(async) | 有開啟新線程 并發(fā)執(zhí)行任務(wù) | 有開啟新線程 串行執(zhí)行任務(wù) | 沒有開啟新線程 串行執(zhí)行任務(wù) |
如:
同步分發(fā)到主隊(duì)列
dispatch_sync(dispatch_get_main_queue(), ^{
//不開啟新線程 阻塞線程 同步分發(fā)同步執(zhí)行
});
同步分發(fā)到全局隊(duì)列
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//不開啟新線程 串行執(zhí)行
});
異步分發(fā)到主隊(duì)列
dispatch_async(dispatch_get_main_queue(), ^{
//不開啟新線程 串行執(zhí)行
});
異步分發(fā)到全局隊(duì)列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//有開啟新線程 并發(fā)執(zhí)行任務(wù)
});
更多GCD相關(guān)文章
并發(fā)編程之Operation Queue和GCD
GCD基礎(chǔ)知識集合