iOS開發——多線程編程(GCD)

來源:互聯網
上載者:User

標籤:

Grand Central Dispatch簡介

Grand Central Dispatch 簡稱 GCD 是蘋果公司開發的技術,是對於多核編程的較新解決方案。它主要用於最佳化應用程式以支援多核處理器以及其他對稱式多處理系統。
GCD 提供了一種很簡單的操作方式來實現平行處理。你可以把你要的並發執行的代碼放在一個block鐘,然後把這個block加入到一個queue當中。
在GCD中為我們需要執行的block提供了3種隊列:

  • Main:這個隊列順序執行我們的block,並保證這些block都在主線程中執行。
  • Concurrent:這個隊列會遵循FIFO的原則來執行其中的block,自動為你管理線程。
  • Serial:這個類型的隊列每次執行一個block,也遵循FIFO的規則。
GCD的基本使用

建立一個隊列,將比較耗時的工作以block的形式放入到該隊列中執行,以避免阻塞主線程。

//建立一個隊列dispatch_queue_t queue = dispatch_get_global_queue(0, 0);    //將隊列queue中的block以非同步形式執行    dispatch_async(queue, ^{        for (int i = 0; i < 100; i++) {            [NSThread sleepForTimeInterval:0.02];        }    });

建立一個隊列的時候,需要傳入兩個參數。第一個參數決定該隊列的優先順序,隊列的優先順序越高,別加入到該隊列裡的block越先被執行。參數的選擇範圍如下:

#define DISPATCH_QUEUE_PRIORITY_HIGH 2#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0#define DISPATCH_QUEUE_PRIORITY_LOW (-2)#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

數值越小,優先順序越低。高優先順序的隊列中block會早於低優先順序隊列中的block執行。

為了方便地使用 GCD,蘋果提供了一些方法方便我們將 block 放在主線程 或 後台線程執行,或者延後執行。使用的例子如下:

//  後台執行:dispatch_async(dispatch_get_global_queue(0, 0), ^{     // something});// 主線程執行:dispatch_async(dispatch_get_main_queue(), ^{     // something});// 一次性執行:static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{    // code to be executed once});// 延遲 2 秒執行:double delayInSeconds = 2.0;dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);dispatch_after(popTime, dispatch_get_main_queue(), ^(void){    // code to be executed on the main queue after delay});

dispatch_queue_t 也可以自己定義,如要要自訂 queue,可以用 dispatch_queue_create 方法,樣本如下:

dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);dispatch_async(urls_queue, ^{     // your code});dispatch_release(urls_queue);

另外,GCD 還有一些進階用法,例如讓後台 2 個線程並存執行,然後等 2 個線程都結束後,再匯總執行結果。這個可以用 dispatch_group, dispatch_group_async 和 dispatch_group_notify 來實現,樣本如下:

dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{     // 並存執行的線程一});dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{     // 並存執行的線程二});dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{     // 匯總結果});

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.