前言
相对于Android
来说 iOS定时任务用起来还是比较好用的
具体来说有三种
GCD
方式NSTimer
CADisplayLink
一般都用前两种
做视图绘制 动画 视频等才用第三种
使用方式
GCD方式
延时执行一次
1 | double delayInSeconds = 2.0; |
重复执行
1 | NSTimeInterval period = 1.0; //设置时间间隔 |
停止方式
1 | dispatch_cancel(_timer); |
NSTimer方式
创建方式
1 | NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats: YES]; |
或者
1 | NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES]; |
两种方式是等效的 第一种会自动加入到MainRunloop
的NSDefaultRunLoopMode
中
停止方式(非循环的可以不掉用)
1 | [timer invalidate]; |
CADisplayLink
创建方式
1 | self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; |
停止方式
[self.displayLink invalidate];
self.displayLink = nil;
重要属性
frameInterval
NSInteger
类型的值,用来设置间隔多少帧调用一次selector
方法,默认值是1,即每帧都调用一次。iOS为60帧/s
如果设置为60则 每秒调用一次selector
方法duration
readOnly
的CFTimeInterval
值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间
=duration
×frameInterval
。
当把CADisplayLink
对象add
到runloop
中后,selector
就能被周期性调用,类似于重复的NSTimer
被启动了;
执行invalidate
操作时,CADisplayLink
对象就会从runloop
中移除,selector
调用也随即停止,类似于NSTimer
的invalidate
方法。