標籤:
除了上一篇文章說到到NSThread線程,還有一個GCD(Grand Central Dispath),是Apple新開發的一個解決多核編程的解決方案,充分的利用CPU資源,將所有的任務,放到一個任務隊列進行調度。 GCD 預設提供了全域的並發隊列,供整個應用使用,不需要建立。
- 同步和非同步區別
- dispatch_sync 同步:不具備開啟線程的能力
- dispatch_async 非同步 :具備開啟線程的能力
- 任務的執行方式
- 並發隊列:多個任務同時執行,並發只能在一步函數下才執行 “非同步“
- 串列隊列:讓任務一個接一個的運行
注意:一般在實際開發中最常用的是 dispatch_async 。
下面介紹幾種常用的隊列使用
一:最最常用的全域並發隊列:
//擷取全域並發隊列 let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //將任務添加到隊列中 並發執行 dispatch_async(queue) { () -> Void in //doSomething...任務1 } dispatch_async(queue) { () -> Void in //doSomething...任務2 } dispatch_async(queue) { () -> Void in //doSomething...任務3 } //暫停一個隊列 dispatch_suspend(queue) //繼續隊列 dispatch_resume(queue)
二:串列隊列,隊列中的任務不會並發執行,會一個任務執行完成後再執行另外一個任務
//建立串列隊列 let serialQueue = dispatch_queue_create("dispatch_queue_name", nil) //將任務添加到隊列中 一個任務執行完成後再執行另一個任務 dispatch_async(serialQueue) { () -> Void in //doSomething... 任務1 } dispatch_async(serialQueue) { () -> Void in //doSomething... 任務2 } dispatch_async(serialQueue) { () -> Void in //doSomething... 任務3 }
三:GCD線程間的通訊,通常用於子線程請求完資料,回到主線程更新UI
//線程間通訊 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in // 在子線程做一些事情 dispatch_async(dispatch_get_main_queue(), { () -> Void in //在主線程更新UI... }) }
四:線程延時執行
//線程延時執行 let second:Double = 3.0 let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC))) //3s後回到主線程中執行任務 dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in } //3s後會開啟一個新的線程執行隊列中的任務 dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in }
五:一次性代碼,顧名思義,在應用生命週期內,block裡代碼塊只會執行一次。
var once:dispatch_once_t = 0 dispatch_once(&once, { () -> Void in //在應用生命週期內只執行一次 })
六:隊列組:將一些任務放進一個隊列組,當所有任務執行完成後,會執行組的notify。
/**********************************隊列組******************************************/ let group = dispatch_group_create() let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_group_async(group, groupQueue){ () -> Void in //任務1 } dispatch_group_async(group, groupQueue){ () -> Void in //任務2 } dispatch_group_async(group, groupQueue){ () -> Void in //任務3 } dispatch_group_notify(group, groupQueue) { () -> Void in // 會等任務1、任務2、任務3執行完畢後執行 }
完!
iOS開發:使用GCD實現多線程