iOS - dispatch_after解说
dispatch_after 是来延迟执行的GCD方法,因为在主线程中我们不能用sleep来延迟方法的调用,所以用dispatch_after是最合适的
dispatch_after 能让我们添加进队列的任务延时执行,该函数并不是在指定时间后执行处理,而只是在指定时间追加处理到dispatch_queue
GCD是Grand Central Dispatch的缩写,是苹果对多核硬件上执行并发代码的一种支持。
它有以下优点:
- GCD通过把计算密集型任务放于后台运行,以此提高APP的响应速度。
- GCD提供了更简单的并发模型,它优于线程锁,并且帮助你避免并发bug。
- GCD基于底层、高性能的优化常规类型的代码,例如单例。
//该方法的第一个参数是 time,第二个参数是 dispatch_queue,第三个参数是要执行的block。
//在主线程中延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//Your code...
});
特别注意 : 上面这句 dispatch_after 的真正含义是在6秒后把任务添加进队列中,并不是表示在6秒后执行,大部分情况该函数能达到我们的预期,只有在对时间要求非常精准的情况下才可能会出现问题。
参数dispatch_time_t解析
dispatch_time_t 有两种形式的构造方式,第一种相对时间:通过 dispatch_time 函数。第二种是绝对时间,通过 dispatch_walltime 函数来获取,其需要使用一个 timespec 的结构体来得到dispatch_time_t。
dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>) //DISPATCH_TIME_NOW 表示现在,NSEC_PER_SEC 表示的是秒数,它还提供了 NSEC_PER_MSEC 表示毫秒
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, *NSEC_PER_SEC); //10s 之后‘执行’(也就是上面说的加入到队列中) dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>) //要使用一个 timespec 的结构体
dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)
dispatch_time_t time_w = dispatch_walltime(DISPATCH_TIME_NOW, * NSEC_PER_SEC); NSLog(@"——————————————————————————");
//在主线程中延迟执行
dispatch_after(time_w, dispatch_get_main_queue(), ^{
NSLog(@"=======================");
});
解析dispatch_time和dispatch_walltime
dispatch_time stops running when your computer goes to sleep. dispatch_walltime continues running. So if you want to do an action in one hour minutes, but after 5 minutes your computer goes to sleep for 50 minutes, dispatch_walltime will execute an hour from now, 5 minutes after the computer wakes up. dispatch_time will execute after the computer is running for an hour, that is 55 minutes after it wakes up.
dispatch_time 得到的时间长度是相对的,与设备 running 时间相关,即设备运行时才计时;而 dispatch_walltime 设定的时间段是绝对的,与设备是否running无关;
iOS - dispatch_after解说的更多相关文章
- 路由器配置及IP设置及ping命令使用
OSI的七层协议体系结构: 物理层.数据链路层.网络层.运输层.会话层.表示层.应用层 TCP/IP是一个四层的体系结构: 网络接口层.网际层(互联网层)(IP或ARP或ICMP).运输层(TCP或U ...
- iOS单例设计模式具体解说(单例设计模式不断完好的过程)
在iOS中有非常多的设计模式,有一本书<Elements of Reusable Object-Oriented Software>(中文名字为<设计模式>)讲述了23种软件设 ...
- Cocos2d-x内存管理解说在ios开发中
使用过 Cocos2d-x 都知道,其中有一套自己实现的内存管理机制,不同于一般 C++ 的编写常规,而在使用前,了解其原理是有必要的,网上已经有很多对内部实现详细解说的文章.而对于使用者而言,并不需 ...
- ios url网址相关问题解说
问题1:ios网址中存在汉字的情况,需要GB_18030_2000编码方法如下: // 汉字转编码 + (NSString *)changeChineseWithEncodingGB_18030_20 ...
- iOS网络编程--ASIHTTPRequest框架安装和配置-图文解说
ASIHTTPRequest框架是优秀的第三方Objective-C的HTTP框架,支持Mac OS X和iOS下的HTTP开发.技术支持网站是http://allseeing-i.com/ASIHT ...
- Android IOS WebRTC 音视频开发总结(五八)-- 图文解说视频直播原理
本文主要介绍rtmp&hls视频直播原理,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 现在视频直播很火 ...
- iOS 力学动画生成器UIKit Dynamics 之碰撞效果解说
UIKit Dynamic是iOS7 新增的一组类和方法.可赋予UIView逼真的行为和特征,不须要写动画效果那些繁琐的代码,让开发者可以轻松地改善应用的用户体验.一共同拥有6个可用于定制UIDyna ...
- iOS开发之再探多线程编程:Grand Central Dispatch详解
Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...
- iOS开发之Masonry框架源码深度解析
Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...
随机推荐
- 2java.lang.NoClassDefFoundError异常
1.错误信息 2.错误分析: JVM读到程序的第三行,会在当前路径 "D:\java" 下寻找com.yangquan.aolun这个包路径下的Cat类,但当前路径下根本就没有co ...
- 回归JavaScript基础(九)
主题:理解对象,创建对象. 小明是一名程序猿,也是一条单身狗!他常常自嘲:每天都会有很多对象,但却没有女朋友! 多么痛的领悟.哈哈,目前比较流行的编程语言都是面向对象的语言(Object-Orient ...
- 关于 ExpressRoute 的虚拟网络网关
虚拟网络网关用于在 Azure 虚拟网络和本地位置之间发送网络流量. 配置 ExpressRoute 连接时,必须创建并配置虚拟网络网关和虚拟网络网关连接. 创建虚拟网络网关时,需要指定几项设置. 其 ...
- Oracle EBS 清理归档
oraprod 登陆数据库服务器 执行 rman target / 如图: 执行: delete noprompt force archivelog all completed before ‘sys ...
- Oracle EBS OM发运行状态自动更改
- 借助System.Linq.Dynamic, IQueryable根据排序字符串排序
在使用Entity Framework时,若有多个排序,需要OrderBy (OrderByDescending)再ThenBy (ThenByDescending) 假设需要根据Name升序排序,再 ...
- Jquery Ajax 提交json数据
在MVC控制器(这里是TestController)下有一个CreateOrder的Action方法 [HttpPost] public ActionResult CreateOrder(List&l ...
- 名词解释:Linux内存管理之RSS和VSZ
Linux内存管理中不管是top命令还是pmap命令,都会有RSS和VSZ这两个名词,这里解释一下: RSS( Resident Set Size )常驻内存集合大小,表示相应进程在RAM中占用了多少 ...
- ARC中block块作为属性的使用笔记
ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...
- django中的权限控制(form增删改)
Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制.但如果通过集成LD ...