iOS開發多線程之GCD程序員
iOS開發之GCD串行隊列性能優化
iOS開發之GCD併發隊列bash
什麼是GCD網絡
GCD的優點多線程
GCD的2個核心概念併發
GCD的使用就2個步驟異步
GCD會自動將==隊列==中的==任務==取出,放到對應的==線程==中執行; 任務的取出遵循對象的==FIFO原則:先進先出,後進後出==async
==畫圖分析== 程序員要作的,將任務添加到隊列;隊列按照程序員指定的方式,調度任務。執行任務的方法:同步/異步 同步:一個任務沒有結束,就不會執行下一個任務 異步:不用等待任務執行完畢,就會執行下一個任務函數
GCD有一個「線程池」;
圖1:同步線程圖例
圖2:異步線程圖例
在viewController 的touchBegain方法裏去調用方法。[self 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]);
});
}
複製代碼
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用完就釋放了。
});
}
複製代碼
原文做者:集才華美貌於一身的—C姐