GCD初識

  • 什么是GCD
    GCD是牛逼的中樞調(diào)度器。它是純C語言,提供了很多非常強(qiáng)大的函數(shù)

  • GCD的優(yōu)勢
    它是蘋果公司為多核的并行運(yùn)算提供的解決方案
    GCD會自動利用CPU的內(nèi)核
    GCD會自動管理線程的生命周期(創(chuàng)建線程,調(diào)度線程,線程銷毀)

任務(wù)和隊(duì)列

GCD中的兩個核心概念

  • 任務(wù):執(zhí)行什么操作
  • 隊(duì)列:用于存放任務(wù)

GCD使用的兩個步驟

  1. 定制任務(wù)
    確定想做的事情
  2. 將任務(wù)添加到隊(duì)列中
    GCD會自動將隊(duì)列中的任務(wù)取出,放到對應(yīng)的線程中
    任務(wù)的取出遵循隊(duì)列FIFO原則:先進(jìn)先出,后進(jìn)后出
執(zhí)行任務(wù)
Snip20160722_4.png

同步和異步的區(qū)別:
同步:只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力

隊(duì)列的兩大類型
Snip20160722_5.png

代碼演示

/**
 * 異步函數(shù) + 串行隊(duì)列 :會開啟新的線程,但是線程是串行的,一個執(zhí)行完執(zhí)行下一個
 */
- (void)asyncSerial {
    
    
    // 創(chuàng)建串行隊(duì)列
    dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", DISPATCH_QUEUE_SERIAL);
    
    // 或者寫NULL, NULL就是串行隊(duì)列
//    dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", NULL);
    
    // 2.將任務(wù)加入隊(duì)列(async 異步)
    dispatch_async(queue, ^{
        
        NSLog(@"1----%@", [NSThread currentThread]);
        
    });
    
    dispatch_async(queue, ^{
        
        NSLog(@"2----%@", [NSThread currentThread]);
        
    });
    
    dispatch_async(queue, ^{
        
        NSLog(@"3----%@", [NSThread currentThread]);
        
    });

}


/**
 * 同步函數(shù) + 并發(fā)隊(duì)列 :不能開啟新的線程,肯定沒有并發(fā)能力
 */
- (void)syncConcurrent {
    // 獲得全局的并發(fā)隊(duì)列
    // 第一個參數(shù)是優(yōu)先級,第二個先傳0就行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 2.將任務(wù)加入隊(duì)列(async 異步)
    dispatch_sync(queue, ^{
       
            NSLog(@"1----%@", [NSThread currentThread]);
       
    });
    
    dispatch_sync(queue, ^{
      
            NSLog(@"2----%@", [NSThread currentThread]);
       
    });
    
    dispatch_sync(queue, ^{
      
            NSLog(@"3----%@", [NSThread currentThread]);
       
    });

}

/**
 * 異步函數(shù) + 并發(fā)隊(duì)列 :可以同時(shí)開啟多條線程
 */
- (void)asyncConcurrent {
    // 1.創(chuàng)建并發(fā)隊(duì)列, 也可以不用創(chuàng)建
    // label 相當(dāng)于隊(duì)的名字  DISPATCH_QUEUE_CONCURRENT 并發(fā)
//    dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
    
    // 獲得全局的并發(fā)隊(duì)列
    // 第一個參數(shù)是優(yōu)先級,第二個先傳0就行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 2.將任務(wù)加入隊(duì)列(async 異步)
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"1----%@", [NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"2----%@", [NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"3----%@", [NSThread currentThread]);
        }
    });
}


Snip20160723_1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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