iOS開發:使用GCD實現多線程

來源:互聯網
上載者:User

標籤:

  除了上一篇文章說到到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實現多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.