文章分享至我的個人技術部落格: https://cainluo.github.io/15018603425788.html
GCD的介紹
GCD
為Grand Central Dispatch
的縮寫。
Grand Central Dispatch (GCD)
是蘋果爸爸開發的一個多核程式設計的較新的解決方法。它主要用於優化應用程式以支援多核處理器以及其他對稱多處理系統。它是一個線上程池模式的基礎上執行的並行任務。在Mac OS X 10.6
雪豹中首次推出,也可在iOS 4
及以上版本使用。
為什麼要選擇GCD
在iOS
開發中, 我們都知道除了GCD
還有NSThread
, NSOperation & NSOperationQueue
, 加上本來就是基於Unix
系統的Pthreads
, 這裡就不多說了, 只講GCD
.
GCD
可以用在多核並行運算GCD
會自動利用更多的CPU核心, 不會有一核有難, 九核圍觀的情況.GCD
會自動管理執行緒的生命週期, 比如建立執行緒, 排程任務, 銷燬執行緒等等操作.- 對我們程式設計師而已, 就是
GCD
非常的簡單, 只需要告訴它去執行什麼任務就好了, 管理執行緒什麼的都去死吧.
轉載宣告:如需要轉載該文章, 請聯絡作者, 並且註明出處, 以及不能擅自修改本文.
GCD的任務和佇列
這裡要普及兩個核心思想: 任務, 佇列.
任務
所謂的任務, 就是指我們程式設計師放在
GCD
裡的操作, 一般是用Block
方式進行, 這裡有兩種執行任務的操作,同步執行
和非同步執行
, 兩個的區別就是在是否開啟新執行緒進行操作.
同步執行: 在GCD
裡是sync
, 不會開啟新執行緒, 只會在當前執行緒進行操作.
非同步執行: 在GCD
裡是async
, 可以另外開啟一個新的執行緒執行任務.
佇列
佇列指的是任務佇列, 用來存放任務的佇列, 可以說佇列是一種比較特殊的線性表, 採用的是先進先出(FIFO)原則, 就像是出高速公路收費站一樣, 從最前面一個開始, 排在前面的車子交了費先走, 才到下一個, 這裡的佇列分為兩種,
並行佇列
和序列佇列
.
並行佇列: 全名為Concurrent Dispatch Queue
, 指的是可以讓多個任務同時執行, 如果用到並行佇列的話, 是會自動開啟多個執行緒同時執行任務.
序列佇列: 全名Serial Dispatch Queue
, 指的是任務一個接一個的執行, 完成了前面的那個就到後面那個, 和我們剛剛舉的收費站例子一樣.
注意: 並行佇列只有在非同步執行(dispatch_async)才有效.
GCD的使用步驟
其實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~~