玩轉iOS開發:iOS中的GCD開發(一)

文章分享至個人我的技術博客: https://cainluo.github.io/15018603425788.htmlhtml


GCD的介紹

GCDGrand Central Dispatch的縮寫。git

Grand Central Dispatch (GCD)是蘋果爸爸開發的一個多核編程的較新的解決方法。它主要用於優化應用程序以支持多核處理器以及其餘對稱多處理系統。它是一個在線程池模式的基礎上執行的並行任務。在Mac OS X 10.6雪豹中首次推出,也可在iOS 4及以上版本使用。程序員

爲何要選擇GCD

iOS開發中, 咱們都知道除了GCD還有NSThread, NSOperation & NSOperationQueue, 加上原本就是基於Unix系統的Pthreads, 這裏就很少說了, 只講GCD.github

  • GCD能夠用在多核並行運算
  • GCD會自動利用更多的CPU內核, 不會有一核有難, 九核圍觀的狀況.
  • GCD會自動管理線程的生命週期, 好比建立線程, 調度任務, 銷燬線程等等操做.
  • 對咱們程序員而已, 就是GCD很是的簡單, 只須要告訴它去執行什麼任務就行了, 管理線程什麼的都去死吧.

轉載聲明:如須要轉載該文章, 請聯繫做者, 而且註明出處, 以及不能擅自修改本文.編程


GCD的任務和隊列

這裏要普及兩個核心思想: 任務, 隊列.微信

任務

所謂的任務, 就是指咱們程序員放在GCD裏的操做, 通常是用Block方式進行, 這裏有兩種執行任務的操做, 同步執行異步執行, 兩個的區別就是在是否開啓新線程進行操做.app

同步執行:GCD裏是sync, 不會開啓新線程, 只會在當前線程進行操做. 異步執行:GCD裏是async, 能夠另外開啓一個新的線程執行任務.異步

隊列

隊列指的是任務隊列, 用來存聽任務的隊列, 能夠說隊列是一種比較特殊的線性表, 採用的是先進先出(FIFO)原則, 就像是出高速公路收費站同樣, 從最前面一個開始, 排在前面的車子交了費先走, 纔到下一個, 這裏的隊列分爲兩種, 並行隊列串行隊列.async

並行隊列: 全名爲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~~


最後

碼字很費腦, 看官賞點飯錢可好

微信

支付寶
相關文章
相關標籤/搜索