GCD簡介(Grand Central Dispatch)
GCD是純C語言,提供了非常多的強(qiáng)大函數(shù)
GCD是非常高效的多線程開發(fā)方式,它并不是Cocoa框架的一部分
GCD優(yōu)勢
1.GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案
2.GCD會自動利用更多的CPU內(nèi)核(比如雙核基公、四核)
3.GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程)
4.開發(fā)者只需要告訴GCD想要執(zhí)行什么任務(wù)辫秧,不需要編寫任何線程管理代碼【總結(jié)】:GCD就是將任務(wù)添加到隊(duì)列,并且指定執(zhí)行任務(wù)的函數(shù)被丧。
GCD使用 (GCD的核心就是dispatch隊(duì)列任務(wù))
1.定義任務(wù)
2.將任務(wù)添加到隊(duì)列中
GCD隊(duì)列
1.主線程隊(duì)列 (提交的任務(wù)將會在主線程完成)
- 可以通過dispatch_get_main_queue獲得
-
主隊(duì)列就是主線程盟戏,它是一個串行隊(duì)列,在iOS中只有主線程才能擁有權(quán)限向渲染服務(wù)提交圖層信息甥桂,完成圖形顯示工作柿究。所以和UI相關(guān)操作,必須在主線程執(zhí)行
2.全局并發(fā)隊(duì)列(Gobal queue) 全局并發(fā)隊(duì)列由整個進(jìn)程共享黄选,有高蝇摸,中(默認(rèn)),低办陷,后臺四個優(yōu)先級
3.自定義隊(duì)列
· 并發(fā)隊(duì)列
- 全局隊(duì)列是并發(fā)隊(duì)列
- 通過dispatch_queue_create創(chuàng)建探入,第二個參數(shù)是DISPATCH_QUEUE_CONCURRENT等
- 不用等待上個任務(wù)是否完成,直接啟用新的線程執(zhí)行新的任務(wù)懂诗。
· 串行隊(duì)列:
- 通過dispatch_queue_create創(chuàng)建蜂嗽,第二個參數(shù)賦值為DISPATCH_QUEUE_SERIAL或者NULL。
- 串行隊(duì)列在同一時間只能執(zhí)行一個任務(wù) 整體如下圖所示:
GCD任務(wù)
GCD任務(wù)就是操作的意思殃恒,就是在block塊中的代碼通過什么方式執(zhí)行植旧。執(zhí)行任務(wù)有兩種方式:同步和異步,兩者主要區(qū)別是:是否等待隊(duì)列的任務(wù)執(zhí)行結(jié)束离唐,以及是否具備開辟線程的能力病附。
同步執(zhí)行(sync)
- 1.同步添加任務(wù)到指定的隊(duì)列中,在添加的任務(wù)執(zhí)行結(jié)束之前亥鬓,會一直等待完沪,直到隊(duì)列里面的任務(wù)完成之后再繼續(xù)執(zhí)行。
- 2.只能在當(dāng)前線程中執(zhí)行任務(wù)嵌戈,不具備開啟新線程的能力覆积。
異步執(zhí)行 (async)
- 1.異步添加任務(wù)到指定的隊(duì)列中,它不會做任何等待熟呛,可以繼續(xù)執(zhí)行任務(wù)宽档。
- 2.可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力庵朝。
GCD的基本寫法:
//還原基礎(chǔ)寫法
- (void)syncTest{
dispatch_block_t block = ^{
NSLog(@"hello GCD");
};
//串行隊(duì)列
dispatch_queue_t queue = dispatch_queue_create(@"com.hm.cn", NULL);
//函數(shù)
dispatch_async(queue, block);
}
下面再將隊(duì)列和任務(wù)搭配執(zhí)行看打印結(jié)果:
/**
同步并發(fā)
*/
- (void)concurrentSyncTest{
dispatch_queue_t queue = dispatch_queue_create("HM", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10 ; i++){
dispatch_sync(queue, ^{
NSLog(@"同步并發(fā)-%d-%@", i , [NSThread currentThread]);
});
}
}