前面一二也說過,iOS中多線程編程工具主要有: 程序員
這三種方法都簡單易用,各有千秋.同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);