一、GCD的基本使用
<1>GCD简介
- 什么是GCD
-
- 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”
-
- 纯C语言,提供了非常多强大的函数
- GCD的优势
-
- GCD是苹果公司为多核的并行运算提出的解决方案
- GCD会自动利用更多的CPU内核(比如双核、四核)
- GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
- 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
<2>GCD的使用
- GCD的使用就2个步骤
-
- 定制任务
- 确定想做的事情
- 将任务添加到队列中
-
- GCD会自动将队列中的任务取出,放到对应的线程中执行
- 任务的取出遵循队列的FIFO原则:先进先出,后进后出
<3>GCD的两个函数
<4>GCD中容易混淆的术语
二、GCD中的各种队列代码示例
<1>异步函数 + 并发队列
<2>同步函数 + 并发队列
<3>异步函数 + 串行队列
<4>同步函数 + 串行队列
<5>异步函数 + 主队列
<6>同步函数 + 主队列
- 各种队列执行结果总结
三、GCD线程间的通信
- 小练习 -- 利用GCD下载图片,并显示
四、GCD常用函数
<1>延时执行的三种方法,这里再整理一遍
<2>一次性代码
<3>GCD barrier(屏障方法)
五、GCD迭代
- 小练习 -- 将from文件夹中的图片文件 快速 剪切 到to文件夹中
六、GCD队列组
- 小练习 -- 下载两张图片,最后合成一张
1 // 队列组 -- 先将分组内的任务完成,再继续完成别的任务 2 // -- 小练习,开启线程同时加载两张图片,最后开启线程合成两张图片 3 - (void)group 4 { 5 // 创建组队列 6 dispatch_group_t group = dispatch_group_create(); 7 8 // 下载图片,添加到组队列中执行 9 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 10 11 NSURL *url = [NSURL URLWithString:@"https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTC9Yx9QWW8eh4xEVDZnBATSZXQHkL0LTM9hTdzjqeoT6jkrjzBGg"]; 12 13 NSData *data = [NSData dataWithContentsOfURL:url]; 14 15 self.image1 = [UIImage imageWithData:data]; 16 }); 17 18 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 19 20 NSURL *url = [NSURL URLWithString:@"https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQkEXf64P3SfSaLmFdjn9IwjGk5wMtZRfqivcijRplqMLUJbbm7kaNhaCsV"]; 21 22 NSData *data = [NSData dataWithContentsOfURL:url]; 23 24 self.image2 = [UIImage imageWithData:data]; 25 }); 26 27 // 合成图片,队列中的任务执行完后,执行这段代码 28 dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 29 30 // 开启新的图形上下文 31 UIGraphicsBeginImageContext(CGSizeMake(300, 150)); 32 33 // 绘制图片 34 [self.image1 drawInRect:CGRectMake(0, 0, 150, 150)]; 35 [self.image2 drawInRect:CGRectMake(150, 0, 150, 150)]; 36 37 // 取得上下文中的图片 38 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 39 40 // 结束上下文 41 UIGraphicsEndImageContext(); 42 43 // 回到主线程显示图片 44 dispatch_async(dispatch_get_main_queue(), ^{ 45 // 4.将新图片显示出来 46 self.imageView.image = image; 47 }); 48 }); 49 }