你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> iOS 多線程GCD簡介

iOS 多線程GCD簡介

編輯:IOS技巧綜合
[摘要]本文是對iOS 多線程GCD簡介的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

一、簡介

  1.1GCD (Grand Central Dispatch )是Apple開發的一個多核編程的解決方法。

    Grand 含義是“偉大的、宏大的”,Central含義“中央的”,Dispatch含義是“分發、派遣,調度”;

  1.2GCD中有2個核心概念

    任務:執行什麼操作

    隊列:用來存放任務

二、使用步驟

  GCD的使用就2個步驟

  1、定制任務 (確定想做的事情)

  2、將任務添加到隊列中 (GCD會自動將隊列中的任務取出,放到對應的線程中執行)

   任務的取出遵循隊列的FIFO原則:先進先出,後進後出

  3、執行任務

   GCD中有2個用來執行任務的常用函數

  3.1 用同步的方式執行任務

   dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); (queue:隊列block:任務)

   3.2 用異步的方式執行任務

   dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

    3.3GCD中還有個用來執行任務的函數:

      dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

      在前面的任務執行結束後它才執行,而且它後面的任務等它執行完成之後才會執行

   3.4同步和異步的區別

      同步:只能在當前線程中執行任務,不具備開啟新線程的能力

      異步:可以在新的線程中執行任務,具備開啟新線程的能力

  4、隊列

    GCD的隊列可以分為2大類型

    4.1並發隊列(Concurrent Dispatch Queue)

      可以讓多個任務並發(同時)執行(自動開啟多個線程同時執行任務)

      並發功能只有在異步(dispatch_async)函數下才有效

    4.2串行隊列(Serial Dispatch Queue)

      讓任務一個接著一個地執行(一個任務執行完畢後,再執行下一個任務)

    4.3 並發隊列創建

      4.3.1使用dispatch_queue_create函數創建隊列

      dispatch_queue_t

      dispatch_queue_create(const char *label, // 隊列名稱

      dispatch_queue_attr_t attr); // 隊列的類型

      創建並發隊列

      dispatch_queue_t queue = dispatch_queue_create("cc.kyle.2016", DISPATCH_QUEUE_CONCURRENT);

      GCD默認已經提供了全局的並發隊列,供整個應用使用,可以無需手動創建

     使用dispatch_get_global_queue函數獲得全局的並發隊列

      dispatch_queue_t dispatch_get_global_queue(

      dispatch_queue_priority_t priority, // 隊列的優先級

      unsigned long flags); // 此參數暫時無用,用0即可

      4.3.2獲得全局並發隊列

      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

      4.3.3全局並發隊列的優先級

      

   4.4串行隊列的創建

      4.4.1GCD中獲得串行有2種途徑

      使用dispatch_queue_create函數創建串行隊列

      創建串行隊列(隊列類型傳遞NULL或者DISPATCH_QUEUE_SERIAL)

      dispatch_queue_t queue = dispatch_queue_create("com.Kyle.queue", NULL);

      使用主隊列(跟主線程相關聯的隊列)

      主隊列是GCD自帶的一種特殊的串行隊列

      放在主隊列中的任務,都會放到主線程中執行

      使用dispatch_get_main_queue()獲得主隊列

      dispatch_queue_t queue = dispatch_get_main_queue();  

    5、各種隊列的執行效果

    

三、一個實例 (異步+並發)

  1、異步+並發 (學習創建多線程的過程)

/**
 * 異步函數 + 並發隊列:可以同時開啟多條線程
 */
- (void)asyncConcurrent
{
    // 1.創建一個並發隊列
    // label : 相當於隊列的名字
    // dispatch_queue_t queue = dispatch_queue_create("com.kyle.gcd, DISPATCH_QUEUE_CONCURRENT);
    
    // 或者
  //1.獲得全局的並發隊列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2.將任務加入隊列 dispatch_async(queue, ^{ for (NSInteger i = 0; i<10; i++) { NSLog(@"one-----%@", [NSThread currentThread]); } }); dispatch_async(queue, ^{ for (NSInteger i = 0; i<10; i++) { NSLog(@"two-----%@", [NSThread currentThread]); } }); dispatch_async(queue, ^{ for (NSInteger i = 0; i<10; i++) { NSLog(@"three-----%@", [NSThread currentThread]); } }); NSLog(@"asyncConcurrent--------end"); }

  2、結果: (通過結果可以看出、有多條線程在執行、並且異步)

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved