- Grand Central Dispatch。它是蘋果為多核的并行運算提出的解決方案腐魂,所以會自動合理地利用更多的CPU內(nèi)核(比如雙核、四核)逐纬,最重要的是它會自動管理線程的生命周期(創(chuàng)建線程蛔屹、調(diào)度任務(wù)、銷毀線程)豁生,完全不需要我們管理兔毒,我們只需要告訴干什么就行漫贞。同時它使用的也是 c語言,不過由于使用了 Block(Swift里叫做閉包)育叁,使得使用起來更加方便迅脐,而且靈活。所以基本上大家都使用 GCD 這套方案豪嗽,老少咸宜谴蔑,實在是居家旅行、殺人滅口龟梦,必備良藥隐锭。
同步:必須等待當(dāng)前語句執(zhí)行完畢,才會執(zhí)行下一條語句
異步:不用等待當(dāng)前語句執(zhí)行完畢计贰,就可以執(zhí)行下一條語句
- GCD與 NSThread 的對比
所有的代碼寫在一起的钦睡,讓代碼更加簡單,易于閱讀和維護(hù)NSThread 通過 @selector 指定要執(zhí)行的方法蹦玫,代碼分散赎婚。 GCD 通過 block 指定要執(zhí)行的代碼,代碼集中樱溉。使用 GCD 不需要管理線程的創(chuàng)建/銷毀/復(fù)用的過程挣输!程序員不用關(guān)心線程的生命周期。如果要開多個線程 NSThread 必須實例化多個線程對象福贞。NSThread 靠 NSObject 的分類方法實現(xiàn)的線程間通訊撩嚼,GCD 靠 block。
- 串行隊列
以先進(jìn)先出的方式挖帘,順序調(diào)度隊列中的任務(wù)執(zhí)行完丽。無論隊列中所指定的執(zhí)行任務(wù)函數(shù)是同步還是異步,都會等待前一個任務(wù)執(zhí)行完成后拇舀,再調(diào)度后面的任務(wù)逻族。
dispatch_queue_tqueue = dispatch_queue_create("itcast.cn", DISPATCH_QUEUE_SERIAL);
dispatch_queue_tqueue =dispatch_queue_create("itcast.cn", NULL);
- 并發(fā)隊列
以先進(jìn)先出的方式,并發(fā)調(diào)度隊列中的任務(wù)執(zhí)行骄崩。
如果當(dāng)前調(diào)度的任務(wù)是同步執(zhí)行的聘鳞,會等待任務(wù)執(zhí)行完成后,再調(diào)度后續(xù)的任務(wù)要拂。 如果當(dāng)前調(diào)度的任務(wù)是異步執(zhí)行的抠璃,同時底層線程池有可用的線程資源,會再新的線程調(diào)度后續(xù)任務(wù)的執(zhí)行脱惰。
dispatch_queue_t queue = dispatch_queue_create("cn.itcast", DISPATCH_QUEUE_CONCURRENT);
- 主隊列
1.專門用來在主線程上調(diào)度任務(wù)的隊列搏嗡。
不會開啟線程。
以先進(jìn)先出的方式拉一,在主線程空閑時才會調(diào)度隊列中的任務(wù)在主線程執(zhí)行采盒。
如果當(dāng)前主線程正在有任務(wù)執(zhí)行旧乞,那么無論主隊列中當(dāng)前被添加了什么任務(wù),都不會被調(diào)度纽甘。
2.主隊列的獲取
主隊列是負(fù)責(zé)在主線程調(diào)度任務(wù)的
會隨著程序啟動一起創(chuàng)建
主隊列只需要獲取不用創(chuàng)建
dispatch_queue_t queue = dispatch_get_main_queue();
-
總結(jié)