您的位置:首页 > 移动开发 > IOS开发

iOS中定时器有三种

2016-09-06 12:04 239 查看
iOS中定时器有三种,分别是NSTimer、CADisplayLink、dispatch_source,下面就分别对这三种计时器进行说明


一、NSTimer

创建方法

TimerInterval
: 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法
target
: 需要执行方法的对象。
selector
 : 需要执行的方法
repeats
 : 是否需要循环

释放方法

注意 :

调用创建方法后,
target
对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。

特性

存在延迟

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

必须加入Runloop

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


二、CADisplayLink

创建方法

停止方法

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

特性

屏幕刷新时调用
CADisplayLink
是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。
CADisplayLink
以特定模式注册到
runloop
后,每当屏幕显示内容刷新结束的时候,
runloop
就会向
CADisplayLink
指定的
target
发送一次指定的
selector
消息, 
CADisplayLink
类对应的
selector
就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率
60次/秒


延迟
iOS
设备的屏幕刷新频率是固定的,
CADisplayLink
在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。

如果CPU过于繁忙,无法保证屏幕
60次/秒
的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决
CPU
的忙碌程度。

使用场景

从原理上可以看出,
CADisplayLink
适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。

重要属性

frameInterval

NSInteger
类型的值,用来设置间隔多少帧调用一次
selector
方法,默认值是1,即每帧都调用一次。

duration

readOnly
CFTimeInterval
值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在
target
selector
被首次调用以后才会被赋值。
selector
的调用间隔时间计算方式是:
调用间隔时间
= duration × frameInterval



三、dispatch_source

创建方法

停止方法

特性

默认是重复执行的,可以在事件响应回调中通过
dispatch_source_cancel
方法来设置为只执行一次,如下代码:

重要属性

start

计时器起始时间,可以通过
dispatch_time
创建,如果使用
DISPATCH_TIME_NOW
,则创建后立即执行

interval

计时器间隔时间,可以通过
timeInterval * NSEC_PER_SEC
来设置,其中,
timeInterval
为对应的秒数

leeway

这个参数的理解,我觉得http://www.dreamingwish.com上Seven's

同学的解释很直观也很易懂:“这个参数告诉系统我们需要计时器触发的精准程度。所有的计时器都不会保证100%精准,这个参数用来告诉系统你希望系统保证精准的努力程度。如果你希望一个计时器没五秒触发一次,并且越准越好,那么你传递0为参数。另外,如果是一个周期性任务,比如检查email,那么你会希望每十分钟检查一次,但是不用那么精准。所以你可以传入60,告诉系统60秒的误差是可接受的。这样有什么意义呢?简单来说,就是降低资源消耗。如果系统可以让cpu休息足够长的时间,并在每次醒来的时候执行一个任务集合,而不是不断的醒来睡去以执行任务,那么系统会更高效。如果传入一个比较大的leeway给你的计时器,意味着你允许系统拖延你的计时器来将计时器任务与其他任务联合起来一起执行。

优点:

时间准确

可以使用子线程,解决定时间跑在主线程上卡UI问题

注意事项:

需要将dispatch_source_t timer设置为成员变量,不然会立即释放
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: