如果程序要让某个方法重复执行,可以借助定时器来完成。CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器,NSTimer的精确度低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。本章节我们来看一下这两种类的基本用法。

一、NSTimer属性方法介绍

  • TimeInterval:指定每隔多少秒执行一次任务。
  • invalidate:终止计时器
  1. + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

调用上面类方法可以创建NSTimer对象,它总共包含了5个参数:

  • scheduledTimerWithTimeInterval:指定每隔多长时间执行一次任务。
  • target与selector:指定重复执行的任务。
  • userInfo:该参数用于传入额外的附加信息,可以设置为nil。
  • userInfo repeats:指定一个BOOL值,控制是否重复执行任务。

二、CADisplayLink属性方法介绍

CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。在UI相关的动画或者显示内容使用CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。

  • invalidate:终止计时器。
  • duration:提供了每帧之间的时间,也就是每次任务刷新之间的的时间。
  1. - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;//用来将CADisplayLink对象加入到runloop中。
  1. + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)see;//指定重复执行的任务

三、示例代码

  • 在故事板中添加两个按钮,用来指定要开始的计时器类型,并与它所属控制器建立关联

  • 懒加载方式初始化用到的对象
  1. @property (nonatomic, assign) NSInteger count;//记录任务执行的次数
  2. @property (nonatomic, strong) NSTimer *myTimer;
  3. @property (nonatomic, strong) CADisplayLink *myDisplayLink;
  1. - (CADisplayLink *)myDisplayLink{
  2. if (!_myDisplayLink) {
  3. _myDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLink)];
  4. [self.myDisplayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
  5. }
  6. return _myDisplayLink;
  7. }
  8. - (void)displayLink{
  9. NSLog(@"CAD正在执行第%ld此任务",self.count++);
  10. //如果count值大于10就取消计时器
  11. if (self.count > 10) {
  12. NSLog(@"取消定时器");
  13. [self.myDisplayLink invalidate];
  14. self.count = 0;//将计数置为0,确保下一个计时器从0开始计数
  15. }
  16. }
  17. - (NSTimer *)myTimer{
  18. if (!_myTimer) {
  19. _myTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(time) userInfo:nil repeats:YES];
  20. }
  21. return _myTimer;
  22. }
  23. - (void)time{
  24. NSLog(@"NSTimer正在执行第%ld此任务",self.count++);
  25. //如果count值大于10就取消计时器
  26. if (self.count > 10) {
  27. NSLog(@"取消定时器");
  28. [self.myTimer invalidate];
  29. self.count = 0;
  30. }
  31. }
  32. - (NSInteger) count{
  33. if (!_count) {
  34. _count = 1;
  35. }
  36. return _count;
  37. }
  38. - (void)viewDidLoad {
  39. [super viewDidLoad];
  40. [self count];
  41. }
  • 点击相应按钮方法,开始执行计时器
  1. - (IBAction)CADBtn:(id)sender {
  2. [self myDisplayLink];
  3. }
  4. - (IBAction)timerBtn:(id)sender {
  5. [self myTimer];
  6. }

iOS开发--计时器-NSTimer与CADisplayLink的更多相关文章

  1. iOS开发中深入理解CADisplayLink和NSTimer

    一.什么是CADisplayLink 简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕. CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一 ...

  2. iOS:三种常见计时器(NSTimer、CADisplayLink、dispatch_source_t)的使用

    一.介绍 在iOS中,计时器是比较常用的,用于统计累加数据或者倒计时等,例如手机号获取验证码.计时器大概有那么三种,分别是:NSTimer.CADisplayLink.dispatch_source_ ...

  3. iOS定时器-- NSTimer 和CADisplaylink

    iOS定时器-- NSTimer 和CADisplaylink 一.iOS中有两种不同的定时器: 1.  NSTimer(时间间隔可以任意设定,最小0.1ms)// If seconds is les ...

  4. iOS 定时器 NSTimer、CADisplayLink、GCD3种方式的实现

    在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...

  5. iOS开发 - Swift使用GCD实现计时器功能

    前言 开发中,经常会用到定时执行网络请求.倒计时.计时器等功能,本篇文章介绍在iOS开发中,Swift怎样使用GCD实现这些功能. 执行一次 下面的代码将会在5秒后执行,且只执行一次. let tim ...

  6. 转载:iOS开发之让你的应用“动”起来

    在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...

  7. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  8. iOS开发——UI进阶篇(十七)CALayer,核心动画基本使用

    一.CALayer简介 1.CALayer在iOS中,文本输入框.一个图标等等,这些都是UIView你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个其实UIView之所以 ...

  9. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

随机推荐

  1. substr,mb_substr,iconv_substr,array_slice

    通过一个例子来看其关系 /** +---------------------------------------------------------- * 字符串截取,支持中文和其他编码 +----- ...

  2. Unity3D实现立体迷宫寻宝

    Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...

  3. phpcms v9后台登陆验证码无法显示,怎么取消验证码

    phpcms v9后台登陆验证码无法显示论坛里关于这个问题貌似一直没有解决,查看源代码后发现,关键一点是获取验证码的图片与全局变量SITE_URL相关,也就是网站的目录, 所以只要修改cache/co ...

  4. WPF解析PPT为图片

    偶遇需要解析 PPT为单张图片 其中,对于包含动画的PPT页,分别对动画最后效果进行截取,即每个连续动画截取 (动画N个)N+1(原图)张 http://git.oschina.net/jiailiu ...

  5. Careercup - Google面试题 - 5205167846719488

    2014-05-03 23:35 题目链接 原题: For a given node in binary search tree find a next largest number in searc ...

  6. 视频FMS服务器带宽成本分析

    一.现状 调查了一下,主要有两种主流方式,WebRTC或者Flash. 1. WebRTC(不支持IE浏览器,已排除):网页实时通信(英语:Web Real-Time Communication)的缩 ...

  7. mysql 的数据文件

    mysql的数据文件 由于mysql的数据文件结构主要跟mysql的存储引擎相关,这里不做过多解释,具体查看各个引擎章节的内容 .首先上一段小辉老师的教程; 在MySQL 中每一个数据库都会在定义好( ...

  8. 新建标准mavenWeb工程以及Maven的web应用标准目录结构建议

    到现在为止,使用Maven结构的Web工程越来越多,因此在此介绍一下通过Maven来构建项目的相关知识.     文档主要分为两部分:       1.如何通过maven来构建多模块的web项目    ...

  9. EXT--表单AJax提交后台,返回前端数据格式的转换

    前言: 前端发送请求至服务端(Java),得到的数据是Java语言对象所表现的形式,经常需要转换为JSON格式的字符串写出至前端:当前端获取后也往往需要将字符串转换为js的对象.本文描述了在EXT作为 ...

  10. ubuntu中磁盘挂载与卸载

      问题描述:          ubuntu中磁盘的挂载和卸载     问题解决:          (1)ubuntu中磁盘挂载        注:    如上所示,使用命令df查看磁盘使用情况 ...