1、GCD都有哪些使用方式
GCD 的概念 :純 C 語言,提供非常強大的函數。
GCD 的優(yōu)勢:1、為多核的并行運算提出解決方案2、自動利用更多的 CPU 內核3、自動管理線程的生命周期。4、只需要提供執(zhí)行任務,不需要編寫任何線程管理代碼。
GCD的核心概念:1、任務:執(zhí)行什么任務 2、隊列:用來存放隊列
GCD 簡單的使用步驟:1、創(chuàng)建隊列 2、創(chuàng)建任務 3、將任務放入隊列中(gcd 會自動將隊列中任務取出,放在對應的線程中執(zhí)行 任務的取出遵循隊列的 FIFO 原則,先進先出,后進后出)
GCD 的使用—任務:
任務的執(zhí)行:同步(dispatch_sync)+異步(dispatch_async)
同步:只能在當前線程中執(zhí)行任務,不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行,具備開啟新線程的能力。
GCD 的使用—隊列
并發(fā)隊列:準許多個任務同時執(zhí)行;
串行隊列:一個任務執(zhí)行完畢之后,在執(zhí)行下一個任務。
Release:
1、凡是在函數中帶有 create、copy、new、retain 等字眼,都應該在不使用這個數據的時候進行 release。
2、GCD 的數據類型在 ARC 環(huán)境下不需要再 release(非 ARC 環(huán)境下 dispatch_release(queue))
3、CF(Core Foundation)的數據類型在 ARC 環(huán)境下仍然需要 release
同步 + 并發(fā)隊列:(concurrent)
pragma mark - 同步函數 + 并發(fā)隊列:不會開啟新的線程,在當前線程執(zhí)行任務(主線程),順序執(zhí)行,并發(fā)隊列失去了并發(fā)的功能
在實際開發(fā)中,同步任務可以保證執(zhí)行完成之后,才讓后續(xù)的異步任務開始執(zhí)行,用于控制任務之間的先后順序,在后天線程中,處理“用戶登錄”
異步函數 + 并發(fā)隊列:(concurrent)
pragma mark - 異步函數 + 并發(fā)隊列:可以同時開啟多條線程,在當前線程執(zhí)行任務(主線程),無序執(zhí)行(按照任務添加到隊列中的順序被調度),線程條數具體由可調度線程池/底層線程池
來決定
同步函數 + 串行隊列(serial):串行隊列中的任務都是按順序執(zhí)行,誰在前就先執(zhí)行誰;主線程和子線程平等,一樣誰在前選執(zhí)行誰;執(zhí)行完一個才會執(zhí)行下一個任務
pragma mark - 同步函數 + 串行隊列:不會開啟新的線程,在當前線程執(zhí)行任務(主線程),任務是串行的(順序執(zhí)行)
異步函數 + 串行隊列(serial):串行隊列中的任務都是按順序執(zhí)行,誰在前就先執(zhí)行誰;主線程和子線程平等,一樣誰在前選執(zhí)行誰;執(zhí)行完一個才會執(zhí)行下一個任務
pragma mark - 異步函數 + 串行隊列:會開啟新的線程,在子線程執(zhí)行任務,任務是串行的(順序執(zhí)行),只開一條線程
優(yōu)點:將任務放在其它線程中完成,每個任務順序執(zhí)行,方便調試
缺點:并發(fā)能力不強,最多只能使用一條線程。
主隊列:(特殊的串行隊列:跟主線程相關聯(lián)的隊列)
異步 + 并發(fā)隊列:
pragma mark - 異步函數 + 并發(fā)隊列:可以同時開啟多條線程,在當前線程執(zhí)行任務(主線程),無序執(zhí)行(按照任務添加到隊列中的順序被調度),線程條數具體由可調度線程池/底層線程池
來決定
同步函數 + 主隊列:主隊列中不能同步任務,無論是在異步任務前還是后都會死鎖
pragma mark - 同步函數 + 主隊列:不會開啟新的線程,會出現(xiàn)"死等",可能導致主線程
卡死
異步函數 + 主隊列:
pragma mark - 異步函數 + 主隊列:不會開啟新的線程,在當前線程執(zhí)行任務(主線程),任務是串行的(順序執(zhí)行),只開一條線程(適合處理 UI 或者是 UI事件)
GCD 隊列類型的創(chuàng)建方式:
并發(fā)隊列:手動創(chuàng)建,全局隊列
串行隊列:手動創(chuàng)建,主隊列
注意:使用sync函數往當前串行隊列中添加任務,會卡住當前的串行隊列(比如同步主隊列)
區(qū)別】同步 & 異步:同步和異步決定了要不要開啟新的線程
- 同步:只能在當前線程中執(zhí)行任務,不具備開啟新線程的能力
- 異步:可以在新的線程中執(zhí)行任務,具備開啟新線程的能力
【區(qū)別】并發(fā) & 串行:并發(fā)和串行決定了任務的執(zhí)行方式 - 并發(fā):允許多個任務并發(fā)(同時)執(zhí)行
- 串行:一個任務執(zhí)行完畢后,再執(zhí)行下一個任務
同步函數:無論是什么隊列都不會開啟線程
(1)并發(fā)隊列:不會開線程
(2)串行隊列:不會開線程
異步函數:具備開啟線程的能力(但不一定會開線程 ),開啟幾條線程由隊列決定
(1)并發(fā)隊列:能開啟N條線程
(2)串行隊列:開啟1條線程