ios多線程 -- GCD介紹

來源:互聯網
上載者:User

標籤:

GCD (純C語言) 全稱 Grand Central Dispatch,可譯為“偉大的中樞調度器”

優點:
(1) GCD是為多核並行運算提出的解決方案
(2) GCD會自動利用更多的CPU核心(比如雙核、四核)
(3) GCD會自動管理線程的生命週期(建立線程、調度任務、銷毀線程)
(4) 程式員只需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼

核心概念:
(1) 任務(block):執行什麼任務
(2) 隊列(queue):用來存放任務

使用步驟:
(1) 定製任務:確定要執行的操作
(2) 將任務添加到隊列中: GCD 會自動將隊列中的任務取出,放到對應的線程來執行;任務的取出遵守隊列的 FIFO 原則 (先進先出).

GCD執行任務的常用函數
(1) 用同步的方式

/**     *  參數說明     *  @param queue 隊列     *  @param void  任務     */    dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

(2) 用非同步方式

dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

同步非同步區別:
(1) 同步: 只能在當前線程中執行, 不具備開啟線程的能力
(2) 非同步: 可以在新線程中執行, 具備開啟線程的能力.

GCD隊列的類型(3種)
並發隊列(全域隊列):可以讓對個任務並發(同時)執行, 自動開啟多個線程,同時執行任務;(並發的功能只能在非同步執行的時候才有效).

/**     * 優先順序     * DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高     * DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 預設(中)     * DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低     * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 後台     */    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

串列隊列:讓任務一個接一個執行,一個任務執行完畢,才能執行下一個任務.

dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);//dispatch_release(queue); // 非ARC需要釋放手動建立的隊列

串列隊列的特殊情況:主隊列:

dispatch_get_main_queue()

補充:
同步和非同步:主要影響能不能開啟新的線程

  • 同步:不具備開啟新線程的能力
  • 非同步:具備開啟線程的能力

並發和串列主要影響任務的執行方式

  • 並發: 多個任務並發(同時)執行
  • 串列:一個任務執行完畢,下一個任務才開始執行.

組合方式
非同步 並發隊列(最常用)

/**     非同步(dispatch_async)  並發隊列(全域隊列)(最常用)    會建立線程,一次開多條, 並行的執行任務 */- (void)createAsynGload{    //建立並發隊列(全域隊列)    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadA"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadB"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadD"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadE"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadF"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadG"];    });}

非同步 串列隊列(偶爾用)

/** 非同步(dispatch_async)  串列隊列(有時用) 會建立線程,一般開一條, 串列的執行任務 */- (void)createAsynQueue{    //建立隊列(串列隊列,依次執行)    dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadA"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadB"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadD"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadE"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadF"];    });    dispatch_async(queue, ^{        [self downLoad:@"http://ThreadG"];    });}

非同步 主隊列(經常用)

/** 非同步(dispatch_async)  主隊列(很常用) 不會建立線程,在主線程中執行任務 */- (void)createAsynMainQueue{    dispatch_queue_t mianQueue = dispatch_get_main_queue();    dispatch_async(mianQueue, ^{        [self downLoad:@"http://ThreadA"];    });    dispatch_async(mianQueue, ^{        [self downLoad:@"http://ThreadB"];    });    dispatch_async(mianQueue, ^{        [self downLoad:@"http://ThreadD"];    });    dispatch_async(mianQueue, ^{        [self downLoad:@"http://ThreadE"];    });    dispatch_async(mianQueue, ^{        [self downLoad:@"http://ThreadF"];    });    dispatch_async(mianQueue, ^{        [self downLoad:@"http://ThreadG"];    });}

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.