关闭

iOS-CADisplayLink详解以及与NSTimer对比

标签: CADisplayL定时器QuartzCoreNSTimer计时器
679人阅读 评论(2) 收藏 举报
分类:

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器;

CADisplayLink是属于 QuartzCore 框架的,所以和UI界面以及图像的渲染有很大的关系;

CADisplayLink官方文档


这里利用CADisplayLink做了一个计时器,实现效果挺好的

这里写图片描述


01、iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。

02、CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用.

03、在UI相关的动画或者显示内容使用 CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。


    CADisplayLink 比较简单,初始化方法只有一个,类方法
    + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;
     // 将定时器添加到 runloop 运行循环中
    - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
     // 将定时器从 runloop 运行循环中移除
    - (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
     // 注销 CADisplayLink 定时器
    - (void)invalidate;
     // 是否暂停
    @property(getter=isPaused, nonatomic) BOOL paused;
     //  设置时间间隔
    @property(nonatomic) NSInteger frameInterval;


CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(addNum)];

02.将定时器添加到 runloop 运行循环中

  • FOUNDATION_EXPORT NSString * const NSDefaultRunLoopMode; // RunLoop默认运行模式,在UI控件拖拽模式下无效
  • FOUNDATION_EXPORT NSString * const NSRunLoopCommonModes; // RunLoop普通运行模式,适用于一般的UI控件事件中
  • NSRunLoopCommonModes 模式比 NSDefaultRunLoopMode更高级
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

03.设置时间间隔,类型是NSInteger,默认为1.但实际意义是帧,默认每帧调用一次

  • 在iOS中,每一帧是60HZ频率,也就是每一秒刷新60次,所以默认1秒方法执行60次
  • 如果想设置每一秒执行一次,需设置 frameInterval 为 60
    displayLink.frameInterval = 60;    

04.设置是否暂停,pause属性默认是NO

    [displayLink setPaused:YES];

CADisplayLink定时器的一般操作

开启定时器

- (IBAction)begin:(id)sender {
    self.displayLink.paused = NO;
}

暂停定时器

- (IBAction)pause:(id)sender {
    self.displayLink.paused = YES;
}

停止定时器(销毁)

- (IBAction)stop:(id)sender {
    self.displayLink.paused = YES;
    [self.displayLink invalidate];
    self.displayLink = nil;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

使用NSTimer过程中最大的两个坑

坑1. retain cycle问题。在一个对象中使用循环执行的nstimer时,若希望在对象的dealloc方法中释放这个nstimer,结局会让你很失望。这个timer会导致你的对象根本不会被释放...
  • openglnewbee
  • openglnewbee
  • 2016-05-26 16:45
  • 3191

关于NSTimer的一些注意事项

使用“scheduledTimerWithTimeInterval”方法时,NSTimer实例是被加到当前runloop中的,模式是NSDefaultRunLoopMode。而“当前runloop”就...
  • MilletHe
  • MilletHe
  • 2016-08-10 20:46
  • 549

iOS多线程的初步研究(四)-- NSTimer

原文地址  http://www.cnblogs.com/sunfrog/p/3243230.html 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说...
  • lengshengren
  • lengshengren
  • 2013-10-21 10:38
  • 8790

iOS 使用NSTimer中的那些坑

NSTimer的正确使用
  • drift_Axe
  • drift_Axe
  • 2016-11-29 17:24
  • 1696

如何实现一个精准的Timer

如何实现一个精准的Timer 在timer设计中,假如时间精确度大于500毫米,就可以认为是bug。 我们知道,NSTimer的可以精确到50-100毫秒,假如需要更精确的timer,应该如何实现呢?...
  • yhawaii
  • yhawaii
  • 2014-09-18 21:24
  • 5070

NSTimer不准确问题

参考 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSTimer...
  • tuyuanxiu
  • tuyuanxiu
  • 2016-08-02 17:54
  • 938

关于NSTimer的使用和内存释放

-使用攻略//初始化(参照上边初始化方法) NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self select...
  • u012815442
  • u012815442
  • 2016-11-08 10:57
  • 450

iOS经典讲解之NSTimer、CADisplayLink、GCD三种定时器的使用

作者:Loving_iOS 转载请标明出处:http://blog.csdn.net/loving_ios/article/details/50800992 在应用开发过程中,会遇到很多需要循环执行或...
  • Loving_iOS
  • Loving_iOS
  • 2016-03-04 11:17
  • 3487

ios开发之NSTimer 详细设置

ios开发之NSTimer 详细设置
  • ppdyhappy
  • ppdyhappy
  • 2016-05-07 16:26
  • 693

NSTimer和NSRunLoop在子线程中的使用

一 : 什么是NSTimer? 官方给出解释是“A timer provides a way to perform a delayed action or a periodic action. Th...
  • developerhk
  • developerhk
  • 2014-04-21 11:17
  • 2720
    个人资料
    • 访问:136803次
    • 积分:2857
    • 等级:
    • 排名:第14414名
    • 原创:152篇
    • 转载:6篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论