GCD (Grand Central Dispatch) 大中央分配(调度)
GCD简介
Grand Central Dispatch 简称( GCD )是苹果公司开发的技术。以优化应用程序支持多核心处理器和其他的对称多处理系统的系统。
GCD 属于函数级的多线程,性能更高,功能也更加强大
GCD核心概念
任务:具有一定功能的代码段。一般是一个 block 或者函数。
分发队列: GCD 以队列的方式进行工作, FIFO 。
GCD 会根据分发队列的类型,创建合适数量的线程执行队列中的任务。
是基于 C 语言的底层 API
用 Block 定义任务,使用起来非常灵活便捷
提供了更多的控制能力以及操作队列中所不能使用的底层函数
//GCD: 异步执行任务的技术之一,一般是将应用程序中记述的线程管理用代码在系统级实现,由于是系统级的管理,这样的话将有更好的线程效率。
// 1. task 任务
// 2. Queue 队列
// 3. Thread 线程
// Task 是一个一个的任务 , 可以是方法 , 函数
// Queue 队列 为了保证任务的顺利执行 , 线程会被放到队列中 , 顺序执行
// Thead 线程 , 每个任务都会被放到一个适当的线程中执行
// CGD 有两种方式的对线程
// 一个是 searial 串行队列 另一种是 concurrent Queue 并行队列
// 第一种 searial Queue ( 串行线程 ), 串行队列 , 先进先出 (FIFO)
// 特点 : 一个线程执行完之后 , 再执行下一个线程 , 必须等待上一个线程执行完成后 , 下一个线程才会执行
// 第二种 councurrent Queue 是并发队列
// 特点 : 一个线程开始后 , 下一个线程可以执行 , 不必等待前一个线程完成 .
GCD 的基本思想是就将操作 s 放在队列 s 中去执行
操作使用 Blocks 定义
队列负责调度任务执行所在的线程以及具体的执行时间
队列的特点是先进先出 (FIFO) 的,新添加至对列的操作都会排在队尾
提示
GCD 的函数都是以 dispatch( 分派、调度 ) 开头的队列
dispatch_queue_t
串行队列,队列中的任务只会顺序执行
并行队列,队列中的任务通常会并发执行
操作
dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序
dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序
// 线程间通信分为两种:
// 主线程进入子线程(前面的方法都可以)
// 子线程回到主线程
GCD功能
dispatch_async() // 往队列中添加任务,任务会排队执行
dispatch_after() // 往队列中添加任务,任务不但会排队,还会在延迟的时间点执行
dispatch_apply() // 往队列中添加任务,任务会重复执行 n 次
dispatch_group_async() // 将任务添加到队列中,并添加分组标记
dispatch_group_notify() // 将任务添加到队列中,当某个分组的所有任务执行完之后,此任务才会执行
dispatch_barrier_async() // 将任务添加到队列中,此任务执行的时候,其他任务停止执行
dispatch_once() // 任务添加到队列中,但任务在程序运行过程中,只执行一次
dispatch_sync() // 将任务添加到队列中, block 不执行完,下面代码不会执行
GCD简介
Grand Central Dispatch 简称( GCD )是苹果公司开发的技术。以优化应用程序支持多核心处理器和其他的对称多处理系统的系统。
GCD 属于函数级的多线程,性能更高,功能也更加强大
GCD核心概念
任务:具有一定功能的代码段。一般是一个 block 或者函数。
分发队列: GCD 以队列的方式进行工作, FIFO 。
GCD 会根据分发队列的类型,创建合适数量的线程执行队列中的任务。
是基于 C 语言的底层 API
用 Block 定义任务,使用起来非常灵活便捷
提供了更多的控制能力以及操作队列中所不能使用的底层函数
//GCD: 异步执行任务的技术之一,一般是将应用程序中记述的线程管理用代码在系统级实现,由于是系统级的管理,这样的话将有更好的线程效率。
// 1. task 任务
// 2. Queue 队列
// 3. Thread 线程
// Task 是一个一个的任务 , 可以是方法 , 函数
// Queue 队列 为了保证任务的顺利执行 , 线程会被放到队列中 , 顺序执行
// Thead 线程 , 每个任务都会被放到一个适当的线程中执行
// CGD 有两种方式的对线程
// 一个是 searial 串行队列 另一种是 concurrent Queue 并行队列
// 第一种 searial Queue ( 串行线程 ), 串行队列 , 先进先出 (FIFO)
// 特点 : 一个线程执行完之后 , 再执行下一个线程 , 必须等待上一个线程执行完成后 , 下一个线程才会执行
// 第二种 councurrent Queue 是并发队列
// 特点 : 一个线程开始后 , 下一个线程可以执行 , 不必等待前一个线程完成 .
GCD 的基本思想是就将操作 s 放在队列 s 中去执行
操作使用 Blocks 定义
队列负责调度任务执行所在的线程以及具体的执行时间
队列的特点是先进先出 (FIFO) 的,新添加至对列的操作都会排在队尾
提示
GCD 的函数都是以 dispatch( 分派、调度 ) 开头的队列
dispatch_queue_t
串行队列,队列中的任务只会顺序执行
并行队列,队列中的任务通常会并发执行
操作
dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序
dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序
// 线程间通信分为两种:
// 主线程进入子线程(前面的方法都可以)
// 子线程回到主线程
GCD功能
dispatch_async() // 往队列中添加任务,任务会排队执行
dispatch_after() // 往队列中添加任务,任务不但会排队,还会在延迟的时间点执行
dispatch_apply() // 往队列中添加任务,任务会重复执行 n 次
dispatch_group_async() // 将任务添加到队列中,并添加分组标记
dispatch_group_notify() // 将任务添加到队列中,当某个分组的所有任务执行完之后,此任务才会执行
dispatch_barrier_async() // 将任务添加到队列中,此任务执行的时候,其他任务停止执行
dispatch_once() // 任务添加到队列中,但任务在程序运行过程中,只执行一次
dispatch_sync() // 将任务添加到队列中, block 不执行完,下面代码不会执行
dispatch_async_f() //将任务添加到队列中,任务是函数非block
- (void)gcdtest
{
// // 1. 创建全局的并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 1.2 创建异步开启线程2
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
// 1.3 创建异步开启线程3
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
// 1.4 创建异步开启线程4
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
// 2. 创建串行对列
dispatch_queue_t serialqueue = dispatch_queue_create("串行队列", NULL);
// 异步:只开辟一个新的线程,顺序的执行任务.
dispatch_async(serialqueue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_async(serialqueue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
// 同步: 在当前线程中执行,主线程中
dispatch_sync(serialqueue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
// 3.从其他线程回到主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 再非主线程中执行比较复杂和比较耗时操作.
dispatch_async(dispatch_get_main_queue(), ^{
//再主线程中完成刷新UI的事件
});
});
//GCD 其他用法
// iOS中常见的延迟操作有两种
// 方法1
[self performSelector:@selector(afterRun) withObject:nil afterDelay:2];
// 方法2
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));
dispatch_after(when,queue , ^{
[self afterRun];
});
// //将任务添加到队列中,并添加分组标记
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"1%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"2%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"3%@",[NSThread currentThread]);
});
// 任务完成后,得到通知
dispatch_group_notify(group, queue, ^{
NSLog(@"队列执行完毕 %@",[NSThread currentThread]);
});
}
- (void)afterRun
{
NSLog(@"%@",[NSThread currentThread]);
}