GCD1

1.gcd簡介


  • GCD是蘋果公司爲多核的並行運算提出的解決方案
  • GCD會自動利用更多的CPU內核(比如雙
    • 全稱是Grand Central Dispatch
    • 純C語言的,提供了非常多強大的函數
  • 核、四核)
  • GCD會自動管理線程的生命週期(創建線程、調度任務、銷燬線程)
  • 程序員只需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼

2.gcd 核心:將任務添加到隊列

任務:執行什麼操作(方法或者函數)

隊列:存放任務的數據結構

使用步驟:

    1.創建任務

    2.將任務添加到隊列中

3.隊列的類型:

串行隊列:特點  任務一個一個按照順序執行(完成一個任務才能從隊列中去下一個任務)

併發隊列:特點  可以同時調度多個任務併發執行   併發功能只有在異步函數的情況下才有效果

  • 同步的方式執行任務:在當前線程中依次執行任務

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

queue:隊列

block:任務

  • 異步的方式執行任務:新開線程,在新線程中執行任務

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

  • 如果將異步任務添加到併發隊列中,同時底層線程池有可用的線程資源,CPU就會調度新線程執行異步任務

4.模式組合

串行隊列  同步執行:不開新線程,使用主線程,一個一個順序執行
串行隊列  異步執行:開一線程,一個一個順序執行
併發隊列  同步執行:不開線程,使用主線程,一個一個順序執行
併發隊列  異步執行:開多個線程,具體開多少個,和底層的線程池關係,併發無序執行

**從一下代碼中可以總結出
//併發隊列 同步執行
- (void)testGcd1
{
    //創建隊列
    dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_CONCURRENT);
    //創建任務
    for(int i=0;i<10;i++)
    {
        dispatch_sync(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}
//併發隊列 異步執行
- (void)testGcd2
{
    dispatch_queue_t queue = dispatch_queue_create("test2", DISPATCH_QUEUE_CONCURRENT);
    
    for(int i=0;i<10;i++)
    {
        dispatch_async(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}
//串行隊列 同步執行
- (void)testGcd3
{
    //創建隊列
    dispatch_queue_t queue = dispatch_queue_create("test3", DISPATCH_QUEUE_SERIAL);
    //創建任務
    for(int i=0;i<10;i++)
    {
        dispatch_sync(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}
//串行隊列 異步執行
- (void)testGcd4
{
    dispatch_queue_t queue = dispatch_queue_create("test4", DISPATCH_QUEUE_SERIAL);
    
    for(int i=0;i<10;i++)
    {
        dispatch_async(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}




總結:開不開線程由同步和異步決定   ,開多少個線程由 串行和併發 來決定
串行隊列只開1 個線程      併發隊列開多個線程

5.系統默認提供了兩個隊列:
    主隊列:
   主隊列的特點:主隊列中的任務只能在主縣城空閒的時候纔會被調度
   又叫全局串行隊列,程序啓動默認爲我門創建了主隊列,在使用的時候不需要創建,
直接get.
   dispatch_get_main_queue();
    全局隊列
   特點:本質上還是併發隊列,全局隊列在mrc的情況下,不用release(只有一個)
           dispatch_get_global_queue(0,0):第一個參數:iOS 8 服務質量 ios7 優先級
           第二個參數,未來使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章