简介
GCD(Grand Central Dispatch)纯C语言编写,提供非常强大的函数,是目前苹果官方网推荐的多线程开发方法,NSOperation便是基于GCD的封装。
GCD的优势
1.GCD是苹果公司为多核的并行运算提供了解决方案
2.GCD会自动利用更多的CPU内核(比如:双核、四核)
3.GCD自动管理线程的生命周期(创建线程、跳读任务、销毁线程)
4.程序员只需要告诉GCD想要执行什么任务,不需要编写任务线程管理任务
GCD的两个核心概念
1.任务:执行什么操作
2.队列:用来存放任务
GCD的队列可分为两大类
并发队列(Concurrent Dispatch Queue)可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异(dispatch_async)函数下才有效。他们要合作才可以
串行队列(Serial Dispatch Queue)只有一个线程,加入到队列中的操作按照添加到顺序依次执行(一个任务执行完毕后,再执行下一个任务)
。。。还有一个特殊的队列就是主队列,用来执行主线程的操作任务
执行队列中任务的两种方式
1.同步执行:只能在当前线程中执行任务,不具备开启新鲜程度能力
// queue:队列, block:任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
2.异步执行:可以在新县城中执行任务,具备开启新线程的能力
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
采用GCD做多线程,可以抽象为两步
1.找到队列(主队列或串行队列或并发队列)
//这是找到了更新UI的主线程所在的队列
dispatch_queue_t mainQueue= dispatch_get_main_queue();
/*
* 创建一个队列
* 第一个参数:队列名字
* 第二个参数:队列类类型
并行队列:DISPATCH_QUEUE_CONCURRENT
串行队列:DISPATCH_QUEUE_SERIAL
*
*/
dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);
/*
* 系统内部给我们提供有一个现成的并发队列
* 第一个参数:线程的优先级, DISPATCH_QUEUE_PRIORITY_BACKGROUND是最低的。
* 第二个参数:系统保留的参数,永远传0
*/
dispatch_queue_t queue = dispatch_get_global_queue(0 , 0);
2.在队列中用同步或异步的方式执行任务
//这里采用的同步方式执行任务,sync是同步,async是异步
dispatch_sync(mainQueue, ^{
});
加载一张图片实例
/**
1、创建视图
2、创建一个串行队列
3、用异步方式执行串行队列中的任务
4、加载网络资源
*/
// 1. 创建视图
UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
[self.view addSubview:imageView];
// 2.创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue",DISPATCH_QUEUE_SERIAL);
// 3、用异步方式执行串行队列中的任务
dispatch_async(serialQueue, ^{
// 4、加载网络资源
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: @"http://download.pchome.net/wallpaper/pic-4345-2-640x1136.jpg"]];
UIImage *image = [UIImage imageWithData:data];
// 5、回到主线程 dispatch_get_main_queue这个函数找到主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
// 6、更新UI
imageView.image = image;
});
});