GCD
GCD (Grand Centeral Dispatch)
苹果自己开发的技术,优化多核处理器,函数级的,效率更高,功能更强大。
同步任务:不管添加到哪种队列中,都是一个个执行,都是在主线程完成。
异步任务: 如果添加在自己创建的串行队列中,则在子线程完成。如果添加在系统创建好的串行队列中,则在主线程完成。
一,串行队列
1.创建串行队列
1.1 获取系统的串行队列
// dispatch_queue_t queue1 =dispatch_get_main_queue();
dispath_queue_t queue1 = dispath_queue_create( "com.lanou.44", DISPATCH_QUEUE_SERIAL);
/*
//2.往串行队列中添加任务 (异步任务)
dispatch_async(queue1, ^{
NSLog(@"任务1 - 线程 %@",[NSThread currentThread]);
});
dispatch_async(queue1, ^{
NSLog(@"任务2 - 线程 %@",[NSThread currentThread]);
});
dispatch_async(queue1, ^{
NSLog(@"任务3 - 线程 %@", [NSThread currentThread]);
});
//2.往串行队列中添加任务 (异步任务)
dispatch_async(queue1, ^{
NSLog(@"任务1 - 线程 %@",[NSThread currentThread]);
});
dispatch_async(queue1, ^{
NSLog(@"任务2 - 线程 %@",[NSThread currentThread]);
});
dispatch_async(queue1, ^{
NSLog(@"任务3 - 线程 %@", [NSThread currentThread]);
});
*/
//2.往串行队列中添加同步任务
dispatch_sync(queue1, ^{
NSLog(@"任务1");
});
dispatch_sync(queue1, ^{
NSLog(@"任务2");
});
dispatch_sync(queue1, ^{
NSLog(@"任务1");
});
dispatch_sync(queue1, ^{
NSLog(@"任务2");
});
// dispatch_release(queue1);//MRC 环境下需要将自己创建的队列释放
二,并发队列
- (IBAction)handleCurrentQueue:(id)sender {
//2.1 获取并行队列
//2.1.1 使用系统创建好的 全局队列
//参数1:队列的优先级 参数2:预留参数 给0
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.1.1 使用自己创建的全局队列
dispatch_queue_t queue = dispatch_queue_create("com.lanou.ZZ",DISPATCH_QUEUE_CONCURRENT);
//2.1.2 往并发队列中添加异步任务
dispatch_async(queue, ^{
NSLog(@"任务1,线程%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2,线程 %@",[NSThread currentThread]);
});
NSLog(@"%@",[NSThread isMainThread] ? @"主线程":@"子线程");
//从子线程回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"主线程执行刷新UI界面");
});
//2.1 获取并行队列
//2.1.1 使用系统创建好的 全局队列
//参数1:队列的优先级 参数2:预留参数 给0
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.1.1 使用自己创建的全局队列
dispatch_queue_t queue = dispatch_queue_create("com.lanou.ZZ",DISPATCH_QUEUE_CONCURRENT);
//2.1.2 往并发队列中添加异步任务
dispatch_async(queue, ^{
NSLog(@"任务1,线程%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2,线程 %@",[NSThread currentThread]);
});
NSLog(@"%@",[NSThread isMainThread] ? @"主线程":@"子线程");
//从子线程回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"主线程执行刷新UI界面");
});
}
三,分组队列
- (IBAction)handleGroupQueue:(id)sender {
//1.创建并发队列 并发执行此任务
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.创建分组 (自己创建)
dispatch_group_t group = dispatch_group_create();
//3.往队列中添加同一分组的任务
dispatch_group_async(group, queue, ^{
NSLog(@"请求0 ~ 30M的数据,线程%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"请求 30 ~ 60M的数据,线程%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"请求 60 ~ 100M的数据,线程%@",[NSThread currentThread]);
});
//4.在分组中的任务全部执行完毕之后 会触发该方法
dispatch_group_notify(group, queue, ^{
NSLog(@"分组任务完成,开始拼接数据");
});
// dispatch_release(group);//在MRC环境下需要释放分组
//1.创建并发队列 并发执行此任务
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.创建分组 (自己创建)
dispatch_group_t group = dispatch_group_create();
//3.往队列中添加同一分组的任务
dispatch_group_async(group, queue, ^{
NSLog(@"请求0 ~ 30M的数据,线程%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"请求 30 ~ 60M的数据,线程%@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"请求 60 ~ 100M的数据,线程%@",[NSThread currentThread]);
});
//4.在分组中的任务全部执行完毕之后 会触发该方法
dispatch_group_notify(group, queue, ^{
NSLog(@"分组任务完成,开始拼接数据");
});
// dispatch_release(group);//在MRC环境下需要释放分组
}
四,障碍队列
- (IBAction)handleBarrierQueue:(id)sender {
//1.获取并发队列 如果想加障碍 必须是自己创建的队列
dispatch_queue_t queue = dispatch_queue_create("com.lanou.ZZ", DISPATCH_QUEUE_CONCURRENT);
//2. 往并发队列中添加异步任务
dispatch_async(queue, ^{
NSLog(@"写入文件");
});
// 添加障碍 间隔写入和读取
dispatch_barrier_async(queue, ^{
NSLog(@"我是障碍任务,要读取文件");
});
dispatch_async(queue, ^{
NSLog(@"读取文件");
});
// dispatch_release(queue); //释放队列 (在MRC环境下)
//1.获取并发队列 如果想加障碍 必须是自己创建的队列
dispatch_queue_t queue = dispatch_queue_create("com.lanou.ZZ", DISPATCH_QUEUE_CONCURRENT);
//2. 往并发队列中添加异步任务
dispatch_async(queue, ^{
NSLog(@"写入文件");
});
// 添加障碍 间隔写入和读取
dispatch_barrier_async(queue, ^{
NSLog(@"我是障碍任务,要读取文件");
});
dispatch_async(queue, ^{
NSLog(@"读取文件");
});
// dispatch_release(queue); //释放队列 (在MRC环境下)
}
五,重复队列
- (IBAction)handleRepeatQueue:(id)sender {
//1.获取并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加重复任务
//参数1.重复的次数 参数2:队列 参数3:当前的次数
dispatch_apply(2, queue, ^(size_t index) {
NSLog(@"%ld",index);
});
//1.获取并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加重复任务
//参数1.重复的次数 参数2:队列 参数3:当前的次数
dispatch_apply(2, queue, ^(size_t index) {
NSLog(@"%ld",index);
});
}
六,一次队列
- (IBAction)handleOnceQueue:(id)sender {
//代码只执行一次
static dispatch_once_t onceToKen;
dispatch_once(&onceToKen, ^{
NSLog(@"这里的代码只执行一次");
});
//代码只执行一次
static dispatch_once_t onceToKen;
dispatch_once(&onceToKen, ^{
NSLog(@"这里的代码只执行一次");
});
}
七,延迟队列
- (IBAction)handleDelay:(id)sender {
//1.获取队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加延迟任务
dispatch_after(DISPATCH_TIME_FOREVER, queue, ^{
NSLog(@"延迟任务");
});
//1.获取队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加延迟任务
dispatch_after(DISPATCH_TIME_FOREVER, queue, ^{
NSLog(@"延迟任务");
});
}