常用的定时器
直接上代码吧
NSTimer
// 创建定时器(自动定时器以默认方式添加到当前线程runloop中)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self
selector:@selector(run) userInfo:nil repeats:YES];
// 停止定时器
[timer invalidate];
//第二种方法(将定时器添加到runloop中,否则定时器不会启动)
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self
selector:@selector(run) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// 停止定时器
[timer invalidate];
//第一次执行 不必隔5秒钟了 这个方法可以立即执行
[time fire];
CGD
//一次性定时
dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 5.0 * NSEC_PER_SEC);
dispatch_after(timer, dispatch_get_main_queue(), ^(void){
NSLog(@"GCD-----%@",[NSThread currentThread]);
});
//重复执行的定时器
//注意:此处应该使用强引用 strong 否则定时器执行一次之后将会被释放
@property (nonatomic ,strong)dispatch_source_t timer;
//0.创建队列
dispatch_queue_t queue = dispatch_get_main_queue();
//1.创建GCD中的定时器
/*
第一个参数:创建source的类型 DISPATCH_SOURCE_TYPE_TIMER:定时器
第二个参数:0
第三个参数:0
第四个参数:队列
*/
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
queue);
//2.设置时间等
/*
第一个参数:定时器对象
第二个参数:DISPATCH_TIME_NOW 表示从现在开始计时
第三个参数:间隔时间
第四个参数:精准度(表示允许的误差,0表示绝对精准)
*/
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC,
0 * NSEC_PER_SEC);
//3.要调用的任务
dispatch_source_set_event_handler(timer, ^{
NSLog(@"GCD-----%@",[NSThread currentThread]);
});
//4.开始执行
dispatch_resume(timer);
self.timer = timer;
CADisplayLink
// 创建displayLink
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self
selector:@selector(run)];
// 将创建的displaylink添加到runloop中,否则定时器不会执行
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
// 停止定时器
[displayLink invalidate];
displayLink = nil;
调用时机
CADisplayLink是一个和屏幕刷新率同步的定时器类。每次屏幕刷新都会掉用一次该定时器
重要属性
frameInterval:用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。
duration:计算selector的调用间隔时间:调用间隔时间 = duration × frameInterval。