? 在我們了解GCD之前,首先要明白一個概念,GCD是蘋果封裝的一套多線程調用API,目的是為了我們能夠更好的使用多線程,但是,GCD并不能直接對線程進行創建以及銷毀的操作,如果覺得dispatch_get_global_queue這段代碼是用來創建線程的,那么請重新認識GCD。
了解GCD,必須理解兩個概念,任務以及隊列
任務:同步執行(sync)和異步執行(async),可以了解為提取任務的方式。
同步執行和異步執行的區別在于,是否會創建新的線程,是否等待隊列任務執行結束。
同步執行(sync):
同步添加任務到指定的隊列中,在添加的任務執行結束之前,會一直等待,直到隊列里面的任務完成之后再繼續執行。
只能在當前線程中執行任務,不具備開啟新線程的能力。
異步執行(async):
異步添加任務到指定的隊列中,它不會做任何等待,可以繼續執行任務。
可以在新的線程中執行任務,具備開啟新線程的能力
隊列:并發隊列(concurrent)和串行隊列(serial),可以理解為提供任務的方式。
串行隊列(Serial Dispatch Queue):
每次只有一個任務被執行。讓任務一個接著一個地執行。(只開啟一個線程,一個任務執行完畢后,再執行下一個任務)
并發隊列(Concurrent Dispatch Queue):
可以讓多個任務并發(同時)執行。(可以開啟多個線程,并且同時執行任務)
全局隊列(Global Dispatch Queue):
系統封裝全局并發隊列,與并發隊列特性一樣。
主隊列(Main Dispatch Queue):
一種特殊的串行隊列,可以了解為所有被執行的代碼,都會默認加入主隊列中,并在主線程上執行。
同步執行(sync)和串行隊列(serial):
同步執行不會創建新的線程,并且會等待隊列中的任務執行完畢再執行下一任務。串行隊列按照順序提供任務,一個任務執行完畢提供下一個任務。所以同步執行和串行隊列組合產生的結果是不會創建新線程,串行執行任務。
同步執行(sync)和并行隊列(concurrent):
同步執行不會創建新的線程,并且會等待隊列中的任務執行完畢再執行下一任務。并行隊列按照順序提供任務,但并不會等待上個任務執行完畢,會直接提供下個任務。所以同步執行和并行隊列組合產生的結果是不會創建新線程,串行執行任務。
異步執行(async)和串行隊列(serial):
異步執行會創建新的線程,并且不會等待隊列中的任務執行完畢再執行下一任務。串行隊列按照順序提供任務,一個任務執行完畢提供下一個任務。所以異步執行和串行隊列組合產生的結果是會創建新線程(1個),串行執行任務。
異步執行(async)和并行隊列(concurrent):
異步執行會創建新的線程,并且不會等待隊列中的任務執行完畢再執行下一任務。并行隊列按照順序提供任務,但并不會等待上個任務執行完畢,會直接提供下個任務。所以異步執行和并行隊列組合產生的結果是會創建多個線程,并發執行任務。
同步執行(sync)和主隊列(main):
會造成死鎖,dispatch_sync(dispatch_get_main_queue(),)如果實在主線程中執行的,相當于是在主隊列里添加一個任務A,block中的代碼向主隊列中添加了任務B,任務B開始執行的時候發現主隊列里有任務A就會等待任務A執行,任務A在等待任務B執行完畢才會繼續向下執行,任務A和任務B相互等待造成死鎖。
解決方法:dispatch_sync(dispatch_get_main_queue(),)放入其他線程。
異步執行(sync)和主隊列(main):
參考同步執行與串行隊列,由于主隊列中的任務都是放在主線程中進行的,所以不會再額外創建新的線程,在主線程中串行執行任務。
總結如下:
到此,gcd的主要用法就介紹完了,想要了解gcd其他的一些用法:
GCD 柵欄方法:dispatch_barrier_async(用于等待必要的結果,才能繼續進行的需求)
GCD 延時執行方法:dispatch_after
GCD 一次性代碼(只執行一次):dispatch_once(用于生成單例)
GCD 快速迭代方法:dispatch_apply(用于循環調用和for類似)
GCD 隊列組:dispatch_group
dispatch_group_notify
dispatch_group_wait
dispatch_group_enter、dispatch_group_leave
GCD 信號量:dispatch_semaphore(線程鎖)
請參考本文的參考文檔。