iOS multiple threads(2)------GCD

前面一二也說過,iOS中多線程編程工具主要有: 程序員

  •  NSThread
  • NSOperation
  • GCD

   這三種方法都簡單易用,各有千秋.同NSThread相比,GCD的運行效率更高,開發更簡單。  但GCD確是誘惑力的,由於其自己是apple爲多核的並行運算提出的解決方案.雖然當前移動平臺用雙核的很少,但不影響GCD做爲多線程編程的利器(新一代的apple設備已是雙核了) 編程

概述 多線程

   iOS中,concurrency編程的框架就是GCD(Grand Central Dispatch), GCD的使用很是簡單。它把任務分派到不一樣的queue隊列來處理。開發者把任務代碼裝到一個個block裏面,操做系統把這些任務代碼分派到不一樣的資源 裏去處理,一個簡單的例子來講,爲何初學者寫tableview的時候,滑動列表時總會很卡,由於不少初學者把圖片裝載放到main thread主線程去執行,例如咱們要滑動暢順的話,iOS最快能夠1秒內刷新60次,如何你的一個cell的文字和圖片裝載超過1/60秒的話,天然就 會卡。因此通常咱們會把圖片裝載這些須要多點時間的移出main thread來處理,對於用GCD來講,就是把圖片載入放到另一個queue隊列中來異步執行,當資源準備好了後,放回到main thread中顯示出來。main thread在GCD中就是main queue。 app

    GCD的基礎是dispatch queue和block。咱們來簡單的看下吧: 框架

1. block能夠簡單理解爲一個任務。 異步

block在程序中的表現形式相似:  async


NSString * URL = @"http://";
 ^{
     UIImage * image = [UIImage imageWithURL:URL];
 };


從上例能夠看出,block能夠引用外部做用域的數據。這也是很block和普通函數的區別,block會保存當前執行的上下文。 函數

block定義: 工具

int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;};

//定義了一個Multiply的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,注意{}blocks體裏的;。

//Blocks能夠訪問局部變量,可是不能修改。

              int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//編譯報錯
         return num * multiplier;
     };

//若是要修改就要加關鍵字:__block

         __block int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//這樣就能夠了
         return num * multiplier;
     };

2. dispatch queue是一個FIFO任務隊列,能夠將一些block壓入這個隊列中,系統會按照順序來執行這些block。 ui

下面首先來看使用:

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

async代表異步運行,block表明的是你要作的事情,queue則是你把任務交給誰來處理了.(除了async,還有sync,delay,本文以async爲例).

系統中默認提供了三種dispatch queue:

a. Main. 若是某個block但願在主線程完成,能夠將其push到main dispatch queue中。由dispatch_get_main_queue得到.和ui相關的就要使用Main Queue.

b. Concurrent. 系統會自動建立三個不一樣優先級的dispatch queue。不能保證block嚴格按照順序執行。

能夠同時運行多個任務,每一個任務的啓動時間是按照加入queue的順序,結束的順序依賴各自的任務.使用dispatch_get_global_queue得到.

c. Serial. 須要用戶手動建立,可以保證block嚴格按照push的順序執行。

每次運行一個任務,能夠添加多個,執行次序FIFO. 一般是指程序員生成的,好比:

NSDate *da = [NSDate date];
NSString *daStr = [da description]; constchar*queueName = [daStr UTF8String];
dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);

因而可知,GCD的使用很是簡單。
相關文章
相關標籤/搜索