天天看點

ios GCD ---- (1)

GCD

Grand Central Dispatch

 (GCD)  字面意思 宏大的中央排程器  反正就是很牛逼吧 

在 gcd 中并不叫多線程開發,因為開發者并不涉及線程的開啟和關閉以及排程. 隻是操作任務在隊列中, 所有關于線程的事都是有 GCD 幫我們去做的;

線程的開啟線程的以及操作都是通過 GCD 完成的 是以開發者并不牽扯到線程的排程;隻是排程的任務.具體開多少線程  什麼時候開都有系統自己去操作

主隊列 & 串行隊列的差別?

  一個一個安排任務,隊列特點:FIFO

  -并發隊列:可以排程多個任務

    -串行隊列:必須等待一個任務執行完成,再排程另外一個任務。最多隻能開啟一個線程。

  -主隊列:以FIFO排程任務,如果主線程删共有任何任務在執行,主隊列就不會排程任務,主要負責在主線程上執行任務!

全局隊列

/*
     
     ios 7 
     DISPATCH_QUEUE_PRIORITY_HIGH 2  高優先級
     DISPATCH_QUEUE_PRIORITY_DEFAULT 0 預設優先級
     DISPATCH_QUEUE_PRIORITY_LOW (-2) 低優先級
     DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 非常低 基本忽略
     ios 8 使用者體驗度
     
     *  - QOS_CLASS_USER_INTERACTIVE 使用者互動
     *  - QOS_CLASS_USER_INITIATED   使用者使用
     *  - QOS_CLASS_DEFAULT          預設使用
     *  - QOS_CLASS_UTILITY          使用工具
     *  - QOS_CLASS_BACKGROUND       背景使用
     
     預留參數
     */
    
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
        NSLog(@"異步");
    });      

并發異步

/**
 并發異步 開啟異步線程 執行順序 無序
 第一個參數: 線程辨別符
 第二個參數:DISPATCH_QUEUE_CONCURRENT 并發隊列      
  
*/
dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_async(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }      

并發同步

/**
     并發同步 不開啟線程 按順序執行
     1 線程辨別符
     2 線程狀态, DISPATCH_QUEUE_CONCURRENT 并發隊列
     */
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);

    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_sync(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }      

串行同步

/**
     串行同步 不開啟線程 按順序執行
     
     */
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
    
    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_sync(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }      

串行異步

/**
     串行異步 開啟子線程線程 按順序執行
     */
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
    
    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_async(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }      

 線程組

//建立線程
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
    //建立線程組
    dispatch_group_t g = dispatch_group_create();
    
    dispatch_group_async(g, q, ^{
        
    });
        //添加任務到線程組
    dispatch_group_async(g, q, ^{
        
    });
    dispatch_group_async(g, q, ^{
        
    });
    dispatch_group_async(g, q, ^{
        
    });
    
    /**
     所有任務完成在 制定的線程通知任務完成
     */
    dispatch_group_notify(g, dispatch_get_main_queue(), ^{
        
    });      

單次執行

/*
     隻執行一次
     */
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"隻執行一次線程");
    });
  //通常應用于建立單例 保證線程安全
      

繼續閱讀