文章分享至個人我的技術博客: https://cainluo.github.io/15018603425788.htmlhtml
GCD
爲Grand Central Dispatch
的縮寫。git
Grand Central Dispatch (GCD)
是蘋果爸爸開發的一個多核編程的較新的解決方法。它主要用於優化應用程序以支持多核處理器以及其餘對稱多處理系統。它是一個在線程池模式的基礎上執行的並行任務。在Mac OS X 10.6
雪豹中首次推出,也可在iOS 4
及以上版本使用。程序員
在iOS
開發中, 咱們都知道除了GCD
還有NSThread
, NSOperation & NSOperationQueue
, 加上原本就是基於Unix
系統的Pthreads
, 這裏就很少說了, 只講GCD
.github
GCD
能夠用在多核並行運算GCD
會自動利用更多的CPU內核, 不會有一核有難, 九核圍觀的狀況.GCD
會自動管理線程的生命週期, 好比建立線程, 調度任務, 銷燬線程等等操做.GCD
很是的簡單, 只須要告訴它去執行什麼任務就行了, 管理線程什麼的都去死吧.轉載聲明:如須要轉載該文章, 請聯繫做者, 而且註明出處, 以及不能擅自修改本文.編程
這裏要普及兩個核心思想: 任務, 隊列.微信
所謂的任務, 就是指咱們程序員放在
GCD
裏的操做, 通常是用Block
方式進行, 這裏有兩種執行任務的操做,同步執行
和異步執行
, 兩個的區別就是在是否開啓新線程進行操做.app
同步執行: 在GCD
裏是sync
, 不會開啓新線程, 只會在當前線程進行操做. 異步執行: 在GCD
裏是async
, 能夠另外開啓一個新的線程執行任務.異步
隊列指的是任務隊列, 用來存聽任務的隊列, 能夠說隊列是一種比較特殊的線性表, 採用的是先進先出(FIFO)原則, 就像是出高速公路收費站同樣, 從最前面一個開始, 排在前面的車子交了費先走, 纔到下一個, 這裏的隊列分爲兩種,
並行隊列
和串行隊列
.async
並行隊列: 全名爲Concurrent Dispatch Queue
, 指的是可讓多個任務同時執行, 若是用到並行隊列的話, 是會自動開啓多個線程同時執行任務. 串行隊列: 全名Serial Dispatch Queue
, 指的是任務一個接一個的執行, 完成了前面的那個就到後面那個, 和咱們剛剛舉的收費站例子同樣.優化
注意: 並行隊列只有在異步執行(dispatch_async)纔有效.
其實GCD
的使用很是簡單, 兩步就完成了.
OK
咱們先來看看隊列, 任務的建立方法.
dispatch_queue_create
來建立對象, 這裏須要傳入兩個參數.
DISPATCH_QUEUE_SERIAL
表示串行隊列, DISPATCH_QUEUE_CONCURRENT
表示並行隊列.// 串行隊列的建立方法
dispatch_queue_t queue= dispatch_queue_create("Test.queue", DISPATCH_QUEUE_SERIAL);
// 並行隊列的建立方法
dispatch_queue_t queue= dispatch_queue_create("Test.queue", DISPATCH_QUEUE_CONCURRENT);
複製代碼
dispatch_get_global_queue
來建立全局並行隊列
, 也須要傳入兩個參數.
DISPATCH_QUEUE_PRIORITY_DEFAULT
.0
去代替.// 同步執行任務建立方法
dispatch_sync(queue, ^{
// 這裏聽任務代碼
});
// 異步執行任務建立方法
dispatch_async(queue, ^{
// 這裏聽任務代碼
});
複製代碼
基本上這樣子就算搞定了, 雖然咱們這裏就只有兩種隊列, 但組合起來, 也是很多的:
再另外加上一種叫作主隊列
的特殊隊列, 那就又多了兩種組合:
這裏咱們能夠看一個表格, 更加的清晰知道各個組合的區別:
並行隊列 | 串行隊列 | 主隊列 | |
---|---|---|---|
同步執行(sync) | 不開啓新線程, 串行方式執行任務 | 不開啓新線程, 串行方式執行任務 | 不開啓新線程, 串行方式執行任務 |
異步執行(async) | 開啓新線程, 並行方式執行任務 | 開啓1條新線程, 串行方式執行任務 | 不開啓新線程, 串行方式執行任務 |
關於GCD
的基本知識, 就講到這裏吧, 更詳細的, 後續的文章再補上, 或者能夠去看看GCD官方文檔本身擼擼也ok~~