iOS中最全的各种定时器使用教程

2020-01-21 00:59:16于丽


// 关闭定时器
// 完全销毁定时器, 重新开启的话需要重新创建
// 全局变量, 关闭后需要置为nil
dispatch_source_cancel(_timer);
 
// 暂停定时器
// 可使用dispatch_resume(_timer)再次开启
// 全局变量, 暂停后不能置为nil, 否则不能重新开启
dispatch_suspend(_timer);

三. CADisplayLink

CADisplayLink默认每秒运行60次,通过它的 frameInterval 属性改变每秒运行帧数,如设置为2,意味CADisplayLink每隔一帧运行一次,有效的逻辑每秒运行30次

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

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

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

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


+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel

参数:

target: 调用者 sel: 执行的方法

示例:


- (void) displayLink {
 
 CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayRun:)];
 
 // 大概1s执行一次
// 取值范围 1--100, 值越大, 频率越高
 display.preferredFramesPerSecond = 2;
 
 [display addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)displayRun:(CADisplayLink *)link {
 
 static NSInteger num = 0;
 
 NSLog(@"%ld", (long)num);
 num++;
 
 if (num > 4) {
 
 [link invalidate];
 
 NSLog(@"end");
 }
}

这里的示例不太恰当, 不应该在这种场合使用,

另外, 我们可以使用他的 paused 属性, 来使其暂停, 或继续:


// 暂停
 display.paused = YES;
// 继续
 display.paused = NO;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。


注:相关教程知识阅读请移步到IOS开发频道。