iOS開發多線程之GCD

iOS開發多線程之GCD程序員

iOS開發之GCD同步任務增強面試

iOS開發之GCD串行隊列性能優化

iOS開發之GCD併發隊列bash

GCD的簡單使用

什麼是GCD網絡

  • 全程是Grand Central Dispatch
  • 純C語言,提供很是多強大的函數
  • 多核並行運算,不叫多線程,它只是完成了多線程的封裝和使用

GCD的優點多線程

  • GCD是蘋果公司爲多核的並行運算提出的解決方案;
  • iOS 4.0推出供開發者使用;
  • 使用GCD不關心線程,只要關心隊列;線程的調度是由CPU調度,那麼咱們的CPU是有多核的。若是開發者去調度線程,那是否要考慮CPU的核數了?開發者是否是要考慮適配? 而你使用GCD,則不用動,因此開發者很便利。這就是蘋果多它的CPU多核伏筆
  • GCD 會自動利用更多的CPU內核(好比雙核、四核)
  • GCD會自動管理線程的生命週期(建立線程、調度任務、銷燬線程)
  • 程序員只須要告訴GCD想要執行什麼任務,不須要編寫任何線程管理代碼

任務和隊列

GCD的2個核心概念併發

  • 任務:執行什麼操做
  • 隊列:用來存聽任務

GCD的使用就2個步驟異步

  • 定製任務(肯定想作的事情) 將大象放進冰箱有幾步?
  • 將任務添加到隊列中

GCD會自動將==隊列==中的==任務==取出,放到對應的==線程==中執行; 任務的取出遵循對象的==FIFO原則:先進先出,後進後出==async

==畫圖分析== 程序員要作的,將任務添加到隊列;隊列按照程序員指定的方式,調度任務。執行任務的方法:同步/異步 同步:一個任務沒有結束,就不會執行下一個任務 異步:不用等待任務執行完畢,就會執行下一個任務函數

GCD有一個「線程池」;

  • GCD同步調度任務時,會拿出1根線程,讓它執行隊列中的任務。當一個任務執行完成後,就會再從隊列一個一個的執行;
  • GCD異步調度任務時,首先拿出1根線程,讓這個線程去處理一個任務;當任務開始執行,就再從線程池裏,再獲取一個線程去隊列去順序拿任務執行;指定線程最大併發數;當其中的線程執行任務完畢後,再去隊列中按照FIFO原則獲取任務;

圖1:同步線程圖例

圖2:異步線程圖例

==實例demo 001GCD代碼演示==

在viewController 的touchBegain方法裏去調用方法。[self gcdDemo1]

  • 在viewController裏,gcdDemo1方法:

1.建立隊列 2.添加任務到隊列中 3.將任務添加到隊列,而且會執行

寫block的方法的竅門:寫用函數的思路寫出,太函數名前面加一個括號()和 尖尖符號,再在函數體外面的大括號{}前面加一個尖尖符號

/*
同步執行方法,這句話不執行完,就不會執行下個任務,同步執行不會開啓線程;
*/
-(void)gcdDemo1
{
    //1.建立隊列
    dispatch_queue_t q = dispatch_get_global_queue(0,0);
    //2.任務添加到隊列中
    //2.1定義任務--block
    void (^task)() = ^{
        NSLog(@"%@",[NSThread curresntThread]);
    };
    //2.2 添加任務到隊列,而且會執行
    dispatch_sync(q,task);

    //合併步驟1,2步,省略寫法
    dispatch_sync(q,^{
    NSLog(@"%@",[NSThread currentThread]);
    });

}

複製代碼
  • 在viewController裏異步執行任務,gcdDemo2方法:

1.建立隊列 2.添加任務到隊列中 3.將任務添加到異步隊列,而且會執行

異步執行,若是任務沒有執行完畢,能夠不用等待;異步執行下一個任務。具有開啓線程的能力,異步一般又是多線程的代名詞!

/*
異步任務
*/
-(void)gcdDemo2
{
    //1.建立隊列
    dispatch_queue_t q = dispatch_get_global_queue(0,0);
    //2.1定義任務--block
    void (^task)() = ^{
        NSLog(@"%@",[NSThread curresntThread]);
    };
    //2.2 添加任務到隊列,而且會執行
    dispatch_async(q,task);

}

複製代碼

線程間的通信

GCD之間的線程通信

-(void)gcdDemo3
{
    //指定任務執行方法 -- 異步
    dispatch_async(dispatch_get_global_queue(0,0),^{

    //耗時操做
    NSLog(@"%@",[NSThread currentThread]);

    //更新UI
    dispatch_async(dispatch_get_main_Queue(),^{
        NSLog(@"更新UI%@",[NSThread currentThread]);
    });

    });
}

複製代碼

==修改多線程demo 002--顯示網絡圖片==

-(void)viewDidLoad
{
   //代碼集中,便於維護
    //利用GCD獲取網絡圖片
    //異步執行
    dispatch_async(dispatch_get_global_queue(0,0),^{

    NSURL *url = [NSURL URLWithString:@"http://img3.utuku.china.com/395x0/news/20170629/35381bbe-6e16-4be1-8cf4-4af9107448b7.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];

    //更新UI
    dispatch_async(dispatch_get_main_queue(),^{
        self.imageView.image = image;
        [self.imageView sizeToFit];
        self.scrollView.contentSize = image.size;
    });

    //block沒有循環引用,只是一個代碼塊,由於它沒有做爲屬性,這裏的block用完就釋放了。
    });
}
複製代碼

推薦文集

iOS開發之性能優化

iOS開發之weak底層實現原理

2019年iOS面試必備技術點總結

原文做者:集才華美貌於一身的—C姐

相關文章
相關標籤/搜索