除了上一篇文章說到到NSThread線程,還有一個GCD(Grand Central Dispath),是Apple新開發的一個解決多核編程的解決方案,充分的利用CPU資源,將全部的任務,放到一個任務隊列進行調度。 GCD 默認提供了全局的併發隊列,供整個應用使用,不須要建立。html
注意:通常在實際開發中最經常使用的是 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)
二:串行隊列,隊列中的任務不會併發執行,會一個任務執行完成後再執行另一個任務async
//建立串行隊列 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... }) }
四:線程延時執行spa
//線程延時執行 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。code
/**********************************隊列組******************************************/ 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 // 會等任務一、任務二、任務3執行完畢後執行 }
完!htm