GCD学习之简单小结
1、常用的方法dispatch_async
为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。
用GCD实现这个流程的操作比前面介绍的NSThread NSOperation的方法都要简单。代码框架结构如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 耗时的操作 dispatch_async(dispatch_get_main_queue(), ^{ // 更新界面 });
});
如果这样还不清晰的话,那我们还是用上两篇博客中的下载图片为例子,代码如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURL * url = [NSURL URLWithString:@"1.jpg"]; NSData * data = [[NSData alloc]initWithContentsOfURL:url]; UIImage *image = [[UIImage alloc]initWithData:data]; if (data != nil) { dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = image; }); }
});
运行显示:
是不是代码比NSThread NSOperation简洁很多,而且GCD会自动根据任务在多核处理器上分配资源,优化程序。
系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列,如下:
dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
这里也用到了系统默认就有一个串行队列main_queue
dispatch_queue_t mainQ = dispatch_get_main_queue();
虽然dispatch queue是引用计数的对象,但是以上两个都是全局的队列,不用retain或release。
2、dispatch_group_async
的使用
dispatch_group_async
可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"group1");
});
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"group2");
});
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; NSLog(@"group3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"updateUi");
});
dispatch_release(group);
dispatch_group_async是异步的方法,运行后可以看到打印结果:
2012-09-25 16:04:16.737 gcdTest[43328:11303] group1
2012-09-25 16:04:17.738 gcdTest[43328:12a1b] group2
2012-09-25 16:04:18.738 gcdTest[43328:13003] group3
2012-09-25 16:04:18.739 gcdTest[43328:f803] updateUi
每个一秒打印一个,当第三个任务执行后,upadteUi被打印。
3、dispatch_barrier_async
的使用
dispatch_barrier_async
是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
例子代码如下:
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"dispatch_async1");
});
dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:4]; NSLog(@"dispatch_async2");
});
dispatch_barrier_async(queue, ^{ NSLog(@"dispatch_barrier_async"); [NSThread sleepForTimeInterval:4]; });
dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"dispatch_async3");
});
打印结果:
2012-09-25 16:20:33.967 gcdTest[45547:11203] dispatch_async12012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_async22012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_barrier_async2012-09-25 16:20:40.970 gcdTest[45547:11303] dispatch_async3
请注意执行的时间,可以看到执行的顺序如上所述。
4、dispatch_apply
执行某个代码片段N次。
dispatch_apply(5, globalQ, ^(size_t index) {// 执行5次});
GCD合集:
GCD
dispatch_set_target_queue
dispatch_after
Dispatch Group
dispatch_barrier_async
dispatch_sync
dispatch_apply
dispatch_suspend/dispatch_resume
Dispatch Semaphore
dispatch_once
Dispatch I/O
GCD学习之简单小结相关推荐
- 强化学习+数据库简单小结
[1]主要利用RL实现在有限样本下学习最佳的数据库配置.设计的奖励函数可以有效地提高调优效率,DDPG算法可以在高维连续空间中找到最优配置 基本思想:我们尝试了RL中最经典的Qlearning和DQN ...
- 深度学习培训班当天小结1
宁波深度学习培训当日小结1 来了宁波参加一个深度学习的培训班,虽然大部分的内容其实是之前自学的时候都有了了解,但还是借此机会做个总结. 传统机器学习 深度学习简介 环境设置 传统机器学习 在这个简单的 ...
- 前端基础学习html部分小结
前端基础学习html部分小结 1 了解知识 1.1 网页的组成 html(Hyper Text Markup Language)指的是超文本标记语言,可以加入图片.声音.动画.多媒体等内容.还可以从一 ...
- Java基础知识学习:简单随手记录(3)
学习视频链接:https://www.bilibili.com/video/BV1fh411y7R8?p=1&vd_source=1635a55d1012e0ef6688b3652cefcdf ...
- 后端基础入门技术栈简单小结(非常简单)
后端基础入门技术栈简单小结(非常简单) 本文章同步更新于: 简书:https://www.jianshu.com/p/c8c6f10850e2 CSDN:https://blog.csdn.net/Z ...
- 深度学习之激活函数小结
深度学习之激活函数小结 激活函数的作用和意义:引入非线性,增加网络表达能力: 基本激活函数介绍 首先看一下一些常见的激活函数: Sigmoid: 总结:第一个出现的激活函数,存在以下问题,所以后面基本 ...
- 一个中年程序员学习中国近代史的小结
一个中年程序员学习中国近代史的小结 前言 程序员应该要认真学习历史 一些有意思的说法 哲学论 偏见 程序员学习历史的原因 学习历史首推中国近代史 什么是历史 历史有哪些分类 修史 中国近代史的重要意义 ...
- [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...
[Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Python学习] ...
- 深度学习之损失函数小结
深度学习之损失函数小结 开篇 损失函数在深度学习中的作用相当于引领模型学习的方式,其重要程度不言而喻: 下图为一些损失函数的关系: Sigmoid和Softmax损失 Sigmoid公式:S(x)=1 ...
最新文章
- 更换ubuntu的root的默认python版本
- 升级php影响zabbix吗,zabbix2.0升级到zabbix3.0
- 修改el-popover和el-select样式
- js 动态生成html(js根据后台返回数据生成html页面中的table标签)(转义字符)
- saltstack(三)state
- VMware专家:行动起来 狙击云炒作
- 玩转SpringBoot 2 之项目启动篇
- 微课|Python三种方法统计各分数段内的人数(17分钟)
- 白班夜班不是你想做就做,一切都得听安排
- python菜单栏添加子菜单_python添加菜单图文讲解
- OpenGL: 渲染管线理论
- 网站定时监控平台有哪些 7款好用的实时监控网站工具
- 计算机英语教学设计,英语教学设计doc范文精选
- linux开发之deamon的写法
- 停电后文件变成二进制 修复_尝试并修补二进制启发
- 论文中常见的argmin,argmax是什么意思?
- 【分享】揭发天气秀、桌面秀、雪狐等号称资源占用小的桌面软件的流氓行为!
- 关于什么是大数据智能决策!摘自《大数据智能决策》自动化学报
- Databricks 第5篇:Databricks文件系统(DBFS)
- NASA Panoply读取netcdf画图
热门文章
- 一篇整理JDK8新特性
- 内存修改器 android,Android 内存修改
- idc提供虚拟主机服务器,idc提供虚拟主机服务器
- 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
- Q42将牌洗为逆序2
- 客户端和服务器不支持常用的SSL协议版本或密码套件
- Processing——A Music Game for the Avengers
- linux系统中如何删除文件中一整列数据
- 浏览器通过apache访问php文件提示下载问题,更改项目文件目录
- android 探究marginLeft、marginStart、marginRight、marginEnd