GCD的使用
来源:互联网 发布:深圳淘宝推广培训 编辑:程序博客网 时间:2024/05/23 13:08
// 核心概念:// 任务:block// 队列:把任务放到队列里面,队列先进先出的原则,// 串行队列:顺序,一个一个执行(必须一个任务执行完了,才能从队列里面取出下一个任务)// 并发队列:同时,同时执行很多个任务(可以同时取出很多个任务,只要有线程去执行)// 同步sync:不会开新线程// 异步async:会开新线程,多线程的代名词// 串行队列同步执行:不开线程,在原来线程里面一个一个顺序执行// 串行队列异步执行:开一条线程,在这个新线程里面一个一个顺序执行// 并发队列异步执行:开多个线程,并发执行(不一定是一个一个)执行// 并发队列同步执行:不开线程,在原来线程里面一个一个顺序执行// 阶段性总结:// 1. 开不开线程,由执行任务方法决定,同步不开线程,异步肯定开线程// 2. 开多少线程,由队列决定,串行 最多 开一个线程, 并发可以开多个线程。 具体开多少个,有GCD底层决定,程序猿不能控制- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self gcdTest3];}#pragma GCDG演练/** 并发队列:可以同时执行多个任务 同步任务:不会开辟新线程,是在当前线程执行 结果:不开新线程,顺序一个一个执行。 */- (void)gcdTest4{ //1. 并行队列 dispatch_queue_t queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT); // 2. 同步执行任务 for (int i = 0; i < 10; i++) { dispatch_sync(queue, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); }}/** 并发队列:可以同时执行多个任务 异步执行:肯定会开新线程,在新线程执行 结果:会开很多个线程,同时执行 */- (void)gcdTest3{ //1. 并行队列 dispatch_queue_t queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT); // 2. 异步执行任务 for (int i = 0; i < 10; i++) { dispatch_async(queue, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); }}/** 串行队列:一个一个执行 异步执行:肯定会开新线程,在新线程执行 结果:只会开一个线程,而且所有任务都在这个新的线程里面执行 */- (void)gcdTest2{ // 1. 串行队列 // 下面两种写法是一样的// dispatch_queue_t queue = dispatch_queue_create("itcast", DISPATCH_QUEUE_SERIAL); dispatch_queue_t queue = dispatch_queue_create("itcast", NULL); // 2. 异步执行 for (int i = 0; i < 10; i++) { dispatch_async(queue, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); }}/** 串行队列:顺序,一个一个执行 同步任务:不会开辟新线程,是在当前线程执行 结果:不开新线程,在当前线程顺序执行 dispatch : 调度,GCD里面函数,都是以dispatch开头的 */- (void)gcdTest1{ // 1. 创建一个串行队列 //参数:1. 队列标签 2. 队列的属性 dispatch_queue_t queue = dispatch_queue_create("itcast", DISPATCH_QUEUE_SERIAL); NSLog(@"开始!!"); // 2. 同步执行任务 // 一般只要使用”同步“执行,串行队列对添加的同步任务,会立马执行 dispatch_sync(queue, ^{ NSLog(@"%@", [NSThread currentThread]); }); NSLog(@"完成!!");}
/** 全局队列跟并发队列的区别 1. 全局队列没有名称 并发队列有名称 2. 全局队列,是供所有的应用程序共享。 3. 在MRC开发,并发队列,创建完了,需要释放。 全局队列不需要我们管理 */#pragma CGD - 全局队列- (void)gcdTest8{ // 获得全局队列 /** 参数:第一个参数,一般 写 0(可以适配 iOS 7 & 8) iOS 7 DISPATCH_QUEUE_PRIORITY_HIGH 2 高优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认优先级 DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级 DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级 iOS 8 QOS_CLASS_DEFAULT 0 第二个参数:保留参数 0 */ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); // 添加异步任务 for (int i = 0; i < 10; i++) { dispatch_async(queue, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }#pragma GCD- 同步任务的作用- (void)gcdTest7{ // 并发队列 dispatch_queue_t queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT); /** 例子:有一个小说网站 - 必须登录,才能下载小说 有三个任务: 1. 用户登录 2. 下载小说A 3. 下载小说B */ // 添加任务 // 同步任务,需要马上执行。 不开新线程 dispatch_sync(queue, ^{ NSLog(@"用户登录 %@", [NSThread currentThread]); }); // dispatch_async(queue, ^{ NSLog(@"下载小说A %@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"下载小说B %@", [NSThread currentThread]); });}#pragma GCD-主队列/** 主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程. 同步执行:要马上执行 结果:死锁 */- (void)gcdTest6{ // 1. 获得主队列-> 程序启动,--> 至少有一个主线程-> 一开始就会创建主队列 dispatch_queue_t queue = dispatch_get_main_queue(); NSLog(@"1----"); // 2. 同步执行任务 for (int i = 0; i < 10; i++) { NSLog(@"调度前---"); // 同步:把任务放到主队列里,但需是马上执行 dispatch_sync(queue, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); NSLog(@"睡会"); [NSThread sleepForTimeInterval:2.0]; } NSLog(@"完成----");}/** 主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程. 异步执行: 会开新线程,在新线程执行 结果: 不开线程, 只能在主线程上面,顺序执行! */- (void)gcdTest5{ // 1. 获得主队列-> 程序启动,--> 至少有一个主线程-> 一开始就会创建主队列 dispatch_queue_t queue = dispatch_get_main_queue(); NSLog(@"1----"); // 2. 异步执行任务 for (int i = 0; i < 10; i++) { NSLog(@"调度前---"); // 异步:把任务放到主队列里,但是不需要马上执行 dispatch_async(queue, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); NSLog(@"睡会"); [NSThread sleepForTimeInterval:2.0]; } NSLog(@"完成----");}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"%@", [NSThread currentThread]); // 耗时操作: 放在全局队列,异步执行 // 1. url, 确定一个网络上的资源路径 NSURL *url = [NSURL URLWithString:@"http://fe.topit.me/e/d1/12/1170068721aa112d1el.jpg"]; // 2. 通过url可以下载对应的网络资源, 网络资源传输的都是二进制 NSData *data = [NSData dataWithContentsOfURL:url]; // 3. 二进制转成图片 UIImage *image = [UIImage imageWithData:data]; // 4. 更新UI,在主线程-》 直接把任务添加到主队列,就会在主队列执行 dispatch_async(dispatch_get_main_queue(), ^{ self.iconView.image = image; NSLog(@"-----%@", [NSThread currentThread]); }); }); }
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self once]; }#pragma mark - 一次性执行- (void)once{ static dispatch_once_t onceToken; NSLog(@"%ld", onceToken); dispatch_once(&onceToken, ^{ NSLog(@"%----ld", onceToken); NSLog(@"真的执行一次么?"); }); NSLog(@"完成");}#pragma mark - 调度组(分组)- (void)group{ /** 应用场景: 开发的时候,有的时候出现多个网络请求都完成以后(每一个网络请求的事件长短不一定),再统一通知用户 比如: 下载小说:三国演义, 红楼梦, 金X梅 */ // 实例化一个调度组 dispatch_group_t group = dispatch_group_create(); // 队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); // 任务添加到队列queue dispatch_group_async(group, queue, ^{ NSLog(@"下载小说A---%@", [NSThread currentThread]); }); dispatch_group_async(group, queue, ^{ NSLog(@"下载小说B---%@", [NSThread currentThread]); }); dispatch_group_async(group, queue, ^{ NSLog(@"下载小说X---%@", [NSThread currentThread]); }); // 获得所有调度组里面的异步任务完成的通知// dispatch_group_notify(group, queue, ^{// NSLog(@"下载完成,请观看%@", [NSThread currentThread]); // 异步的// }); //注意点: 在调度组完成通知里,可以跨队列通信 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 更新UI,在主线程 NSLog(@"下载完成,请观看%@", [NSThread currentThread]); // 异步的 });}#pragma mark - 延时操作- (void)delay{ /** 参数: now 0 NSEC_PER_SEC: 很大的数字 */ dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)); // 参数: when : 表示从现在开始,经过多少纳秒以后 // queue : 在哪一个队列里面执行后面的任务// dispatch_after(when, dispatch_get_main_queue(), ^{// NSLog(@"点我了-- %@", [NSThread currentThread]);// });// dispatch_after(when, dispatch_get_global_queue(0, 0), ^{ NSLog(@"点我了-- %@", [NSThread currentThread]); });}
3 0
- 多线程GCD的使用
- GCD的使用.
- GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- iOS GCD的使用
- GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- GCD的使用
- 多线程GCD的使用
- GCD的使用
- 多线程GCD的使用
- gcd的使用
- GCD的简单使用
- GCD的基本使用
- GCD的使用
- JAVA 实现身份证验证
- Spring事务,connection获取,用DataSourceUtils的原理
- 危险!在HashMap中将可变对象用作Key
- iOS获取设备方向(锁屏状态下通用)
- js判断一个对象数组里是否存在某个元素
- GCD的使用
- ftp服务怎么登陆
- 数据库之SQLite增删改查
- LeetCode 33. Search in Rotated Sorted Array(旋转数组搜索)
- Leetcode 97. Interleaving String
- Linux 系统的常用命令之 rm ,rm -rf , rm -f 以及rm 命令的其他参数命令
- FindFirstFile()函数
- 对Java反射机制的总结
- win7安装office2007失败