一、什么是GCD
GCD是苹果官方提供的一种多线程自动管理解决方案。全称是Grand Central Dispatch
为什么用它?
它是苹果为多核的并行运算提出的一个解决方案
它会自动利用cpu内核
它会自动管理线程的生命周期(创建、销毁)
只要告诉它想要执行什么任务,不需要编写任何管理线程的代码
结论:这么好当然要用它!
二、什么是任务和队列
脑补1:
2个核心概念:
(1)任务:执行什么操作
(2)队列:用来存放的任务
2个步骤:
(1) 定制任务
(2) 确定想做的事情
结论:将队列添加到队列中,GCD会自动将队列中的任务取出放到对应的线程中执行,遵循队列FIFO原则(先进先出,后进后出)
三、怎么执行任务
有2个用来执行任务的函数
用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
参数说明:
queue:队列
block:任务
用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
有啥区别?
同步:当前线程中执行
异步:在另一个线程中执行
四、怎么使用队列
简单说就2种队列类型,即并发队列和串行队列
并发队列:可以让多个任务并发(同时进行)
创建方法:默认提供了全局的并发队列,供整个应用使用,不需要手动创建。
串行队列:让任务一个接着一个执行
创建方法:2中途径
使用 dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>) 创建
使用主队列
有四个术语比较容易混淆,容易理解错误
写了几行代码,一目了然
#pragma mark - GCD
- (void)testGCD {
//打印主线程
NSLog(@"主线程----%@",[NSThread mainThread]);
NSLog(@"\n");
NSLog(@"同步并发队列");
/** 同步并发队列
* 结论:不会开启新的线程,并发队列失去了并发的功能
**/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
[self syncQueue:queue];
NSLog(@"\n");
NSLog(@"异步并发队列");
/** 异步并发队列
* 结论:同时开启三个子线程
**/
[self asyncQueue:queue];
NSLog(@"\n");
NSLog(@"同步串行队列");
/** 同步串行队列
* 结论:不会开启新的线程
**/
queue = dispatch_queue_create("com233queue", NULL);
[self syncQueue:queue];
NSLog(@"\n");
NSLog(@"异步串行队列");
/** 异步串行队列
* 结论:会开启线程,但是只开启一个线程
**/
[self asyncQueue:queue];
}
- (void)syncQueue:(dispatch_queue_t)queue {
dispatch_sync(queue, ^{
NSLog(@"同步下载 1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"同步下载 2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"同步下载 3----%@",[NSThread currentThread]);
});
}
- (void)asyncQueue:(dispatch_queue_t)queue {
dispatch_async(queue, ^{
NSLog(@"异步下载 1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"异步下载 2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"异步下载 3----%@",[NSThread currentThread]);
});
}