iOS多線程篇-GCD基本概念使用

簡述

  • 同步函數(shù)和異步函數(shù)
    • 同步函數(shù)
      //傳入的為隊列和任務(wù)
      dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
      
    • 異步函數(shù)
      //傳入的為隊列和任務(wù)
      dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
      
  • 兩個核心概念隊列任務(wù)
    • 隊列

      • 串行隊列
      //兩者可隨意選擇
      dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_SERIAL);
      dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);
      
      • 并發(fā)隊列
      dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);
      
    • 任務(wù)

      • block 來定義的,預(yù)先準(zhǔn)備好的代碼,在需要的時候執(zhí)行
      void (^task)() = ^ {
          NSLog(@"%@", [NSThread currentThread]);
      }
      

重點

  • 同步函數(shù)+串行隊列

    • 代碼
    /**
    不會開線程,串行執(zhí)行
    */
    -(void)gcdDemo1 {
    // 1. 隊列
        /**
         參數(shù)
         1. 隊列的名稱
         2. 隊列的屬性
            DISPATCH_QUEUE_SERIAL(NULL) 表示串行
         */
        //dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);
        // 2. 執(zhí)行任務(wù)
        for (int i = 0; i<10; i++) {
            dispatch_sync(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
    }
    
    • 結(jié)果

  • 同步函數(shù)+并發(fā)隊列

    • 代碼
    //并發(fā)隊列,同步執(zhí)行
    /**
    隊列:并發(fā)隊列,可以調(diào)度多個任務(wù)
    同步:不能開線程
    */
    -(void)gcdDemo2 {
        // 1. 隊列
        dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);
    
        // 2. 異步執(zhí)行
        for (int i = 0; i<10; i++) {
            dispatch_sync(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
    }
    
    • 結(jié)果


  • 同步函數(shù)+主隊列

    • 代碼
    //  主隊列,同步執(zhí)行
    /**
    主隊列:不開線程
    同步任務(wù):不開線程
    */
    -(void)gcdDemo6 {
        // 1. 主隊列
        dispatch_queue_t q = dispatch_get_main_queue();
        // 2. 安排一個任務(wù)
        for (int i = 0; i<10; i++) {
            dispatch_sync(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
    }
    
    • 結(jié)果
可以看到輸出出來的結(jié)果是沒有的
//主隊列的特點,如果發(fā)現(xiàn)當(dāng)前主線程有任務(wù)在執(zhí)行,那么主隊列會暫停調(diào)度隊列里面的任務(wù),所以的話它是不會執(zhí)行隊列里面的內(nèi)容
  • 異步函數(shù)+串行隊列

    • 代碼
        //  串行隊列,異步執(zhí)行
        /**
         串行隊列,一個一個調(diào)度任務(wù)
         執(zhí)行的方法:異步,會開線程
         */
    -(void)gcdDemo3 {
        dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);
        for (int i = 0; i<10; i++) {
            //異步函數(shù)
            dispatch_async(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
    }
    
    • 結(jié)果


  • 異步函數(shù)+并發(fā)隊列

    • 代碼
        //并發(fā)隊列,異步執(zhí)行
        /**
         隊列:并發(fā)隊列,可以調(diào)度多個任務(wù)
         異步:可以開啟線程
         */
    -(void)gcdDemo4 {
        // 1. 隊列
        dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);
    
        // 2. 異步執(zhí)行
        for (int i = 0; i<10; i++) {
            dispatch_async(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
    }
    
    • 結(jié)果


  • 異步函數(shù)+主隊列

    • 代碼
    //  主隊列,異步執(zhí)行
    /**
    隊列:主隊列,不可能在其他線程執(zhí)行
    任務(wù):異步,開線程,不會阻塞線程執(zhí)行,不用等待著一條語句執(zhí)行完,就能執(zhí)行下一句
    */
    -(void)gcdDemo5 {
        // 1. 主隊列 - 程序啟動之后已經(jīng)存在主線程,主隊列同樣存在
        dispatch_queue_t q = dispatch_get_main_queue();
    
        // 2. 安排一個任務(wù)
        for (int i = 0; i<10; i++) {
            dispatch_async(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
    }
    
    • 結(jié)果


補(bǔ)充

異步函數(shù)+并發(fā)隊列:開啟多條線程,并發(fā)執(zhí)行任務(wù)
異步函數(shù)+串行隊列:開啟一條線程,串行執(zhí)行任務(wù)
同步函數(shù)+并發(fā)隊列:不開線程,串行執(zhí)行任務(wù)
同步函數(shù)+串行隊列:不開線程,串行執(zhí)行任務(wù)
異步函數(shù)+主隊列:不開線程,在主線程中串行執(zhí)行任務(wù)
同步函數(shù)+主隊列:不開線程,串行執(zhí)行任務(wù)(注意死鎖發(fā)生)

結(jié)束

                  本章到此結(jié)束
            歡迎各位碼友隨意轉(zhuǎn)載并指正
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容