iOS开发--计时器-NSTimer与CADisplayLink
如果程序要让某个方法重复执行,可以借助定时器来完成。CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器,NSTimer的精确度低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。本章节我们来看一下这两种类的基本用法。
一、NSTimer属性方法介绍
- TimeInterval:指定每隔多少秒执行一次任务。
- invalidate:终止计时器
- + (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:提供了每帧之间的时间,也就是每次任务刷新之间的的时间。
- - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;//用来将CADisplayLink对象加入到runloop中。
- + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)see;//指定重复执行的任务
三、示例代码
- 在故事板中添加两个按钮,用来指定要开始的计时器类型,并与它所属控制器建立关联
- 懒加载方式初始化用到的对象
- @property (nonatomic, assign) NSInteger count;//记录任务执行的次数
- @property (nonatomic, strong) NSTimer *myTimer;
- @property (nonatomic, strong) CADisplayLink *myDisplayLink;
- - (CADisplayLink *)myDisplayLink{
- if (!_myDisplayLink) {
- _myDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLink)];
- [self.myDisplayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
- }
- return _myDisplayLink;
- }
- - (void)displayLink{
- NSLog(@"CAD正在执行第%ld此任务",self.count++);
- //如果count值大于10就取消计时器
- if (self.count > 10) {
- NSLog(@"取消定时器");
- [self.myDisplayLink invalidate];
- self.count = 0;//将计数置为0,确保下一个计时器从0开始计数
- }
- }
- - (NSTimer *)myTimer{
- if (!_myTimer) {
- _myTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(time) userInfo:nil repeats:YES];
- }
- return _myTimer;
- }
- - (void)time{
- NSLog(@"NSTimer正在执行第%ld此任务",self.count++);
- //如果count值大于10就取消计时器
- if (self.count > 10) {
- NSLog(@"取消定时器");
- [self.myTimer invalidate];
- self.count = 0;
- }
- }
- - (NSInteger) count{
- if (!_count) {
- _count = 1;
- }
- return _count;
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self count];
- }
- 点击相应按钮方法,开始执行计时器
- - (IBAction)CADBtn:(id)sender {
- [self myDisplayLink];
- }
- - (IBAction)timerBtn:(id)sender {
- [self myTimer];
- }
iOS开发--计时器-NSTimer与CADisplayLink的更多相关文章
- iOS开发中深入理解CADisplayLink和NSTimer
一.什么是CADisplayLink 简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕. CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一 ...
- iOS:三种常见计时器(NSTimer、CADisplayLink、dispatch_source_t)的使用
一.介绍 在iOS中,计时器是比较常用的,用于统计累加数据或者倒计时等,例如手机号获取验证码.计时器大概有那么三种,分别是:NSTimer.CADisplayLink.dispatch_source_ ...
- iOS定时器-- NSTimer 和CADisplaylink
iOS定时器-- NSTimer 和CADisplaylink 一.iOS中有两种不同的定时器: 1. NSTimer(时间间隔可以任意设定,最小0.1ms)// If seconds is les ...
- iOS 定时器 NSTimer、CADisplayLink、GCD3种方式的实现
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...
- iOS开发 - Swift使用GCD实现计时器功能
前言 开发中,经常会用到定时执行网络请求.倒计时.计时器等功能,本篇文章介绍在iOS开发中,Swift怎样使用GCD实现这些功能. 执行一次 下面的代码将会在5秒后执行,且只执行一次. let tim ...
- 转载:iOS开发之让你的应用“动”起来
在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...
- iOS开发系列--让你的应用“动”起来
--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...
- iOS开发——UI进阶篇(十七)CALayer,核心动画基本使用
一.CALayer简介 1.CALayer在iOS中,文本输入框.一个图标等等,这些都是UIView你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个其实UIView之所以 ...
- iOS开发系列--让你的应用“动”起来
--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...
随机推荐
- 解决Discuz“完善用户资料”任务不能完成的问题
最近用 Discuz X3.2 搭建了个论坛,在测试过程中发现"完善用户资料"这个官方自带的任务有个Bug,将所有的资料都填写完成后,任务仍然无法完成,而且没有明确提示有哪些项目没 ...
- kdbchk: the amount of space used is not equal to block size
一.对数据文件检查 注意:应该在关闭数据库模式下进行bbed的操作 [oracle@ora10 controlfile]$ dbv file=/u01/app/oracle/oradata/ORCL/ ...
- Python开发【第一篇】Python基础之正则表达式补充
正则表达式 一简介:就其本质而言,正则表达式(或RE)是一种小型的.高度专业化的标称语言,(在Python中)它内嵌在Python中,并通过re模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...
- Selenium-RC Python 2.7 环境配置
1.下载并安装Python http://www.python.org/getit/,我使用的是2.7.3的python版本 2.下载并安装setuptools[这个工具是python的基础包工具] ...
- js执行上下文(由浅入深)
每一个函数都有自己的执行上下文EC(执行环境 execution context),并且每个执行上下文中都有它自己的变量对象VO(Variable object),用于存储执行上下文中的变量 .函数声 ...
- Java从入门到精通——基础篇之JSTL标签
一.语言基础 EL(Expression Language)表达式,目的:为了使JSP写起来更加简单.提供了在 JSP 中简化表达式的方法. 二.分类 核心标签库:提供条件判断.属性访问.URL处理及 ...
- MySQL不同库名相同表结构实现主从配置
数据库版本 5.6.16 在两个服务器上,存在不同名字的数据库,但是两个数据库中的所有表结构相同,实现主从复制. 主库服务器的数据库名为yoon,从库服务器的库名为hank 在从库的my.cnf配置文 ...
- JNI-入门之二
Android中JNI编程的那些事儿 首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Na ...
- RethinkDB
RethinkDB最早是作为一个对SSD进行专门优化的MySQL存储引擎出现的,其特点在于对SSD的充分利用.而目前RethinkDB已经脱离MySQL成为一个独立的存储. RethinkDB目前支持 ...
- 语音识别之梅尔频谱倒数MFCC(Mel Frequency Cepstrum Coefficient)
语音识别之梅尔频谱倒数MFCC(Mel Frequency Cepstrum Coefficient) 原理 梅尔频率倒谱系数:一定程度上模拟了人耳对语音的处理特点 预加重:在语音信号中,高频部分的能 ...