问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

iOS三种定时器的用法NSTimer、CADisplayLink、GCD

发布网友 发布时间:2022-09-27 01:52

我来回答

1个回答

热心网友 时间:2023-10-05 23:04

一、NSTimer
1.创建方法

TimerInterval : 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法

target : 需要执行方法的对象。

selector : 需要执行的方法

repeats : 是否需要循环

2.释放方法

3.特点

存在延迟:不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。

必须加入Runloop:使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入Runloop:

二、CADisplayLink

什么是CADisplayLink

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用。

一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。在添加进runloop的时候我们应该选用高一些的优先级,来保证动画的平滑。可以设想一下,我们在动画的过程中,runloop被添加进来了一个高优先级的任务,那么,下一次的调用就会被暂停转而先去执行高优先级的任务,然后在接着执行CADisplayLink的调用,从而造成动画过程的卡顿,使动画不流畅。

ration属性提供了每帧之间的时间,也就是屏幕每次刷新之间的的时间。我们可以使用这个时间来计算出下一帧要显示的UI的数值。但是 ration只是个大概的时间,如果CPU忙于其它计算,就没法保证以相同的频率执行屏幕的绘制操作,这样会跳过几次调用回调方法的机会。frameInterval属性是可读可写的NSInteger型值,标识间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。如果每帧都调用一次的话,对于iOS设备来说那刷新频率就是60HZ也就是每秒60次,如果将 frameInterval 设为2 那么就会两帧调用一次,也就是变成了每秒刷新30次。我们通过pause属性开控制CADisplayLink的运行。当我们想结束一个CADisplayLink的时候,应该调用-(void)invalidate从runloop中删除并删除之前绑定的 targetselector
另外CADisplayLink 不能被继承。

1.创建方法

2.停止方法

当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。

3.特点:

屏幕刷新时调用:CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒 延迟:iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。 如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。 使用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。4. 重要属性 frameInterval NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。 ration readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = ration × frameInterval。

三、GCD

1.执行一次

swift版本:
DispatchSourceTimer
间隔定时器, 相当于repeats设置为true的Timer.
初始化

设置timer参数

示例: 获取验证码60s倒计时

注意事项: 下面两种操作会造成程序崩溃, 原因是: *Timer执行了suspend()操作后, 是不可以被直接释放的, 如果想关闭一个执行了suspend()操作的计时器, 需要先执行resume(), 再执行cancel(), 最后置nil.

CADisplayLink 与 NSTimer 有什么不同?

iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。

NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。并且 NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间的延迟范围。

CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。在UI相关的动画或者显示内容使用 CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。给非UI对象添加动画效果我们知道动画效果就是一个属性的线性变化,比如UIView 动画的 EasyInEasyOut 。通过数值按照不同速率的变化我们能生成更接近真实世界的动画效果。我们也可以利用这个特性来使一些其他属性按照我们期望的曲线变化。比如当播放视频时关掉视频的声音我可以通过CADisplayLink来实现一个 EasyOut的渐出效果:先快速的降低音量,在慢慢的渐变到静音。

注意
通常来讲:iOS设备的刷新频率事60HZ也就是每秒60次。那么每一次刷新的时间就是1/60秒 大概16.7毫秒。当我们的frameInterval值为1
的时候我们需要保证的是 CADisplayLink调用的 target 的函数计算时间不应该大于 16.7否则就会出现严重的丢帧现象。在mac应用中我们使用的不是CADisplayLink而是 CVDisplayLink它是基于C接口的用起来配置有些麻烦但是用起来还是很简单的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我用无线数传模块PTR6000做实验 接收不到数据包 很急啊 祈求高人指导帮 ... Lora无线传输协议技术浅析 南昌定购433M无线通讯模块 福州433m无线模块订购 联想电脑系统重装后怎么连网线电脑做完系统怎么网络连接 电脑重装了系统还是连接不到wifi为什么电脑重装系统后不能连接wifi 笔记本电脑新装系统后连不上wifi为什么电脑重装系统后不能连接wifi 笔记本电脑装系统后无法连接wifi为什么笔记本电脑wifi连接不上 电脑重装系统后搜不到无线网了为什么笔记本电脑重装了系统之后就连不... 求问~怎样区分2018款君越是不是库存车? 杭州市境内的名山大川 吃口香糖有什么好处 吃多了会怎么样 口香糖的利弊? 于川川这名字怎么样 2015年11月21日22点出生名字叫张川怎么样? 在梦里经常梦见高中老师并切很爱他 书面表达。 英语课上, 老师要求大家介绍一下自己的家庭成员。假如你是韩梅, 请根据下面这张全家福 昆山到十字铺有多少公里 兴化到十字铺多少公里 1994年安徽省郎溪县十字铺茶校简介 可转换公司债券的风险是什么? 安徽省宣城市十字铺宝光寺 十字铺到嘉兴市杭州湾大桥多少公里 郎溪十字铺的简介 冒险岛里斗燃角色有什么用 冒险岛里斗燃角色有什么作用和怎样设置 郎溪十字铺的介绍 郎溪县十字铺茶场二分场后郎东村在十字开发区规划区吗 ansys workbench启动后的界面怎么不一样?求解,非常感谢 比较洋气的,求一个好听的 韦姓男孩女孩起名字大全 清蒸鳕鱼怎么做好吃又简单 清蒸鳕鱼好吃又简单的做法 100k是多少数量 中央民族大学疫情通怎么导出 一个手机怎么登录两个 一个手机怎么登录两个 一个手机如何同时登录两个? 一个手机登两个怎么登? 蒜头,辣椒,鸡皮果酱怎么做? 即墨哪里有好玩的地方呢,求各种 燕子能造什么句子你帮我看一下谢谢!。 七六年属什么? 我在青岛即墨,要去青岛玩有什么好玩的地方呢,怎么去呢, 即墨所有好玩好吃的地方有哪些? 国际法律有哪些 论国际法中的最惠国原则 主卧室灯风水上有哪些讲究 卧室灯饰风水 卧室灯安装风水 最全的卧室灯具风水知识 卧室用什么灯风水好 如果把蚁后的肚子踩烂是什么样子,有图就更好