- GCD 即 Grand Central Dispatch的简称,译为“伟大的中枢调度器”。
- 它是一种纯C语言,提供了非常多的强大的函数。
- GCD的优势:
GCD是苹果公司为多核的并行运算提出的解决方案;
GCD会自动利用更多的CPU内核;
GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程);
程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。
GCD中的两个核心概念
任务:执行什么操作
队列:用来存放任务
GCD的使用步骤
- 定制任务:确定想要做的事情
- 将任务添加到队列中:GCD会自动将队列中的任务取出,放到对应的线程中执行,并遵循FIFO原则:先进先出,后进后出。
队列的类型
- 并发队列:允许多个任务并发(同时)执行;并发功能只能在异步(dispatch_async)函数下才有效;
- 串行队列:让任务一个接着一个的执行;
执行队列中任务的两种方式
- 同步:只能在当前线程执行任务,不具备开启新线程的能力
- 异步:可以在新的线程执行任务,具备开启新线程的能力
执行任务
- 用同步的方式执行任务
dispatch_sync(dispatch_queue_t queue , dispatch_block_t block);
-queue: 队列
-block: 任务 - 用异步的方式执行任务
dispatch_async(dispatch_queue_t queue,dispatch_block_t block);
容易混淆的术语
同步、异步、并发、串行
同步和异步主要影响:能不能开启新的线程
- 同步:在当前线程中执行任务,不具备开启新线程的能力;
- 异步:在新的线程中执行任务,具备开启新线程的能力;
并发和串行主要影响:任务的执行方式
- 并发:多个任务并发(同时)执行
- 串行:一个任务执行完毕后,再执行下一个任务
GCD的基本使用
并发+异步 可以开启多线程
-(void)asyncGlobalQueue{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);
dispatch_async(queue, ^{
// block会在子线程中执行
NSLog(@"1:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2:%@",[NSThread currentThread]);
});
}
并发+同步 不会开启新的线程,并发失去了效果
-(void)syncGlobalQueue{
//创建队列(并发)---可以开启多个线程
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//添加任务 同步--- 顺序执行
dispatch_sync(queue, ^{
NSLog(@">1:%@",[NSThread currentThread]);
});
//不会开启新的线程,并发失去了效果
}
串行+异步 不可以开启多个线程
-(void)asyncSearialQueue{
dispatch_queue_t queue = dispatch_queue_create("Abb", NULL);
dispatch_async(queue, ^{
NSLog(@"2:%@",[NSThread currentThread]);
});
//只开辟了一个线程
}
串行+同步
-(void)syncSeariaQueue
{
dispatch_queue_t queue = dispatch_queue_create("dfg", NULL);
//任务
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
总结:
同步/异步主要影响 是能不能开启新的线程
1、同步:在当前的线程中执行任务,不具备开启线程的能力
2、异步:在新的线程中执行任务,具备开启新线程的能力
并发/串行主要影响 任务的执行方式
1、并发:多个任务同时执行
2、串行:一个任务执行完毕之后,在执行下一个任务
使用 GCD去创建一行队列
//第一种
dispatch_queue_t queue = dispatch_queue_create("aaa", 0);
//第二种 最常用的创建队列方式
//系统提供的串行队列的方法
dispatch_queue_t queue = dispatch_get_main_queue();
使用GCD去创建一个并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
几秒之后做一个操作
//参数1:表示的是从现在开始 参数2:延迟时间 NSEC: PER SEC 参数3:任务
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)),dispatch_get_main_queue() , ^{
NSLog(@"3喵就跑");
});
重复往一个队列中添加多个任务
//串行队列
// DISPATCH_QUEUE_CONCURRENT 并发
dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(20, queue, ^(size_t index) {
NSLog(@"%@,%ld",[NSThread currentThread],index);
});
分组
//创建分组
dispatch_group_t group = dispatch_group_create();
//创建队列
dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
//创建任务1
dispatch_group_async(group, queue, ^{
NSLog(@"我是1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"我是2");
});
dispatch_group_async(group, queue, ^{
NSLog(@"我是3");
});
-(void)loadData{
NSURLSession * session = [NSURLSession sharedSession];
NSURLSessionTask * task = [session dataTaskWithURL:[NSURL URLWithString:@""] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI事情
});
}
}];
//启动
[task resume];
}