什么是GCD
GCD是牛逼的中枢调度器。它是纯C语言,提供了很多非常强大的函数GCD的优势
它是苹果公司为多核的并行运算提供的解决方案
GCD会自动利用CPU的内核
GCD会自动管理线程的生命周期(创建线程,调度线程,线程销毁)
任务和队列
GCD中的两个核心概念
- 任务:执行什么操作
- 队列:用于存放任务
GCD使用的两个步骤
- 定制任务
确定想做的事情 - 将任务添加到队列中
GCD会自动将队列中的任务取出,放到对应的线程中
任务的取出遵循队列FIFO原则:先进先出,后进后出
执行任务
同步和异步的区别:
同步:只能在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新线程的能力
队列的两大类型
代码演示
/**
* 异步函数 + 串行队列 :会开启新的线程,但是线程是串行的,一个执行完执行下一个
*/
- (void)asyncSerial {
// 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", DISPATCH_QUEUE_SERIAL);
// 或者写NULL, NULL就是串行队列
// dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", NULL);
// 2.将任务加入队列(async 异步)
dispatch_async(queue, ^{
NSLog(@"1----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3----%@", [NSThread currentThread]);
});
}
/**
* 同步函数 + 并发队列 :不能开启新的线程,肯定没有并发能力
*/
- (void)syncConcurrent {
// 获得全局的并发队列
// 第一个参数是优先级,第二个先传0就行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.将任务加入队列(async 异步)
dispatch_sync(queue, ^{
NSLog(@"1----%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2----%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3----%@", [NSThread currentThread]);
});
}
/**
* 异步函数 + 并发队列 :可以同时开启多条线程
*/
- (void)asyncConcurrent {
// 1.创建并发队列, 也可以不用创建
// label 相当于队的名字 DISPATCH_QUEUE_CONCURRENT 并发
// dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
// 获得全局的并发队列
// 第一个参数是优先级,第二个先传0就行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.将任务加入队列(async 异步)
dispatch_async(queue, ^{
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"1----%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"2----%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"3----%@", [NSThread currentThread]);
}
});
}