簡(jiǎn)介
什么是GCD
- 全稱是Grand Central Dispatch 可譯為“牛逼的中樞調(diào)度器”
- 純C語(yǔ)言势决,提供了非常多強(qiáng)大的函數(shù)
- GCD的優(yōu)勢(shì)
- GCD是蘋(píng)果公司為多核的并行運(yùn)算提出的解決方案
- GCD是通過(guò)利用蘋(píng)果的CPU內(nèi)核
- GCD會(huì)自動(dòng)管理此案程的生命周期 (創(chuàng)建線程来氧、調(diào)度任務(wù)、銷毀線程)
- 程序員只需要告訴GCD想要執(zhí)行什么任務(wù)穷缤,不需要編寫(xiě)任何線程管理代碼
GCD中有兩個(gè)核心概念
- 任務(wù):執(zhí)行什么操作
- 隊(duì)列:用來(lái)存放任務(wù)
GCD的使用就兩個(gè)步驟
- 定制任務(wù)
- 確定想做的事情
將任務(wù)添加到隊(duì)列中
- GCD會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出,放到對(duì)應(yīng)的線程中執(zhí)行
- 任務(wù)的取出遵循隊(duì)列的FIFO原則:先進(jìn)先出 后進(jìn)后出
程序員要做的將任務(wù)添加到隊(duì)列,隊(duì)列按照程序猿制定的方式調(diào)度任務(wù)
執(zhí)行任務(wù)的方法:同步/異步
同步:一個(gè)任務(wù)沒(méi)有結(jié)束江滨,就不會(huì)執(zhí)行下一個(gè)任務(wù)*
異步:不用等待任務(wù)執(zhí)行完畢,就會(huì)執(zhí)行下一個(gè)任務(wù)*
廢話不多說(shuō)直接上代碼
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_scrollView = [[UIScrollView alloc]initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:_scrollView];
_imgView = [[UIImageView alloc]init];
_imgView.frame = CGRectMake(0, 0, _scrollView.frame.size.width,_scrollView.frame.size.height);
[_scrollView addSubview:_imgView];
[self gcdDemo4];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self gcdDemo1];
[self gcdDemo2];
}
/**
*同步執(zhí)行方法厌均,這句執(zhí)行不完唬滑,就不會(huì)執(zhí)行下一個(gè)任務(wù)
*/
- (void)gcdDemo1{
//創(chuàng)建隊(duì)列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//任務(wù)添加到隊(duì)列中
//定義任務(wù) -- block
void(^task)() = ^{
NSLog(@"%@",[NSThread currentThread]);
};
//添加任務(wù)到隊(duì)列,并執(zhí)行
dispatch_sync(q, task);
}
/**
*異步執(zhí)行方法棺弊,如果任務(wù)執(zhí)行不完晶密,異步執(zhí)行下一個(gè)任務(wù)
*具備開(kāi)啟線程的能力
*異步通常是多線程的代言人
*/
- (void)gcdDemo2{
//創(chuàng)建隊(duì)列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//定義任務(wù) -- block
void(^task)() = ^{
NSLog(@"%@",[NSThread currentThread]);
};
//添加任務(wù)到隊(duì)列,并執(zhí)行
dispatch_async(q, task);
}
- (void)gcdDemo3{
//創(chuàng)建隊(duì)列
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"");
//更新UI 主隊(duì)列 就是專門負(fù)責(zé)在主線程上調(diào)度任務(wù)的隊(duì)列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新UI %@",[NSThread currentThread]);
});
});
}
- (void)gcdDemo4{
//異步執(zhí)行 下載圖片
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL *url = [NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573055307227&di=9b66ec39591a4e4776ce02a009eaf193&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201601%2F31%2F20160131102616_NEeim.thumb.700_0.jpeg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:data];
//更新UI (必須回到主線程操作)
dispatch_async(dispatch_get_main_queue(), ^{
self.imgView.image = img;
[self.imgView sizeToFit];
self.scrollView.contentSize = img.size;
});
});
}