前言
相对于Android来说 iOS定时任务用起来还是比较好用的
具体来说有三种
GCD方式NSTimerCADisplayLink
一般都用前两种
做视图绘制 动画 视频等才用第三种
使用方式
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方法。