iOS - CADisplayLink与NSTimer
一、CADisplayLink简介
- CADisplayLink 是一个定时器对象可以让你的应用以与显示器的刷新界面相同的频率进行绘图。
- 应用如果想要创建 display link ,需要提供一个目标对象和一个当屏幕刷新时被调用的选择器方法。之后再将 display link 添加到主线程中。
- 一旦display link与主线程相关联,当屏幕内容需要被刷新的时候目标对象上的选择器方法就会被调用。目标对象可以读取 display link 的时间戳属性去检索下一帧被显示的画面。举个例子,一个执行它自己动画的应用会使用时间戳来确定在哪或者如何去在即将显示的画面中去展示它的对象。
duration
属性提供了一个在两个画面之间的间隔时间。你可以在你的应用中使用这个值来估算显示的帧速率,近似下一帧被显示的时间,和调整行为,以便下一帧准备时间显示。 - 你的应用可以设置 paused 属性为YES来停止通知。同样的,如果你的应用不想用框架所提供的时间,你可以自己选择更慢的帧速率。已提供更慢但是一致的帧速率会比跳帧更加流畅,你可以通过改变
frameInterval
属性来改变改变画面的帧间隔(减少帧速率)。(每几帧调用一次,默认是1,如果是2,对于iOS设备来说那刷新频率就是60HZ也就是每秒60次,如果将 frameInterval 设为2 那么就会两帧调用一次,也就是变成了每秒刷新30次。) - 当你的应用想停止 display link ,它应该调用
invalidate
方法去从主线程中移除它并且消除与目标之间的关联。 CADisplayLink 不能被继承
。
二、NSTimer简介
- 使用 NSTimer 类创建定时器对象或者仅仅是计时器。一个计时器每隔一定的时间间隔运行,然后触发,发送给目标对象一个特殊的消息。举例来说,你能够创建一个 NSTimer 对象发送给窗口一个消息,告诉它在一定时间间隔之后更新它自己。
- 定时器的运行需要结合着 run Loop。为了有效的使用一个定时器,你应该注意如何操作 run loops。请搜索在
Xcode Document
中 NSRunLoop 和 Threading Programming Guide 文章。特别注意,run loops 对它们的定时器保持着强引用,所以你不必去对加到 run loop 中的定时器保持强引用。 - 计时器并不是一个真正的时间机制;它只有在被添加到循环运行模式中的一种的时候才能触发,此时计时器的触发时间一旦过去就能检查出。由于对各种输入源的一个典型run loop 管理,对于一个定时器的时间间隔的有效解决方案被限制在50-100毫秒,如果一个定时器的触发经历了很长的一段时间或者在一个 run loop 的模式下没能监控到计时器,则这个计时器不会触发直到下一次 run loop 再次检测出这个计时器。因此,真正的计时器触发时间可以在预定触发时间之后的很长一段时间之后。可以看看这篇文章 Timer Tolerance。
- 重复计时器与不可重复计时器
- 你可以在创建计时器的时候指定它是可重复的还是不可重复的。一个不可重复的计时器只触发一次然后自动销毁,从而防止计时器再次触发。与之相反,一个可重复的计时器会重复在相同的 run loop 中触发。
- 一个可重复的计时器总是按照预先设计的触发时间执行它自己,而不是实际的出发时间。举个例子,如果一个计时器将在特定的时间每5秒钟之后触发,预定触发时间将总会落后于开始的5秒时间间隔,即使实际的触发时间被推迟。如果到目前为止触发时间被推迟了很久已经错过了一个或者几个触发的时间点,计时器会在下一个触发周期上只触发一次;触发后计时器重新安排,为下一次触发做准备。
- 在 Run Loops 中预设定时器
- 一个定时器对象只能同事被注册在一个 run loop 中,虽然它能被添加到这个 run loop 中的多个 run loop 模式中去。有三种方式创建:
scheduledTimerWithTimeInterval:invocation:repeats:
orscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
类方法创建计时器,将它以默认的模式预设在当前的 run loop 中。timerWithTimeInterval:invocation:repeats:
ortimerWithTimeInterval:target:selector:userInfo:repeats:
类方法创建而没在 run loop 中预设它(创建之后,你必须将它添加到 run loop 中去,使用相应的 NSRunLoopaddTimer :forMode
方法)- 初始化计时器方法
initWithFireDate:interval:target:selector:userInfo:repeats:
- 一旦在 run loop 中预设了定时器,定时器就会在制定的时间间隔触发直到它被销毁。一个不重复的计时器会在触发之后自动被销毁。然而,对于一个重复的计时器,你必须调用它的 invaludate 方法来销毁它。调用这个方法会请求在 当前的 run loop 中将计时器移除;所以,你应该总在创建计时器的线程中来调用 invalidate 方法来销毁它。销毁计时器之后会立即让它无效所以不会再影响 run loop。然后在移除方法之前或者晚一点点 run loop 会将计时器移除(与它的强引用一起移除),一旦被移除,计时器对象就不能再使用。
- 一个定时器对象只能同事被注册在一个 run loop 中,虽然它能被添加到这个 run loop 中的多个 run loop 模式中去。有三种方式创建:
- 子类注意
不能够继承 NSTimer
。
Timer Tolerance:
- 在 iOS 7和 OSX v10.9 之后,你能够为定时器指定一个公差。让系统在计时器触发的时候更加灵活的提升优化系统并增加它的存储和响应的能力。计时器会在预定的时间和预定时间加上公差时间之内触发计时器。计时器不会在预定时间之前触发。对于重复计时器为了避免漂移,下次的触发时间是根据原始的触发时间所估算出来而公差只应用于单次的触发时间。默认值是0,意味着没有更多的公差。系统有权利对于一些计算器使用少量的公差而不管公差的属性值是多少。
- 作为计时器的使用者,也许你有一个对于计时器最合适的公差。一般的经验是对于可重复的计时器设置公差至少有10%的时间间隔。即使少量的公差也将对应用程序产生重大的积极影响。系统可能为公差设置一个最大值。
Toll-Free Bridging:
- 在Core Foundation框架和 Foundation 框架中有许多种数据类型可以被互换着使用。这种能力,被称为: Toll-Free Bridging,意味着你能够使用相同的数据类型作为 Core Foundation 方法调用的参数也可以作为一个OC 方法传递的接受者。举个例子:NSLocale 相对 Core Foundation 是的互换的类型是 CFLocale。因此,如果一个方法中的参数是 NSLocale* 类型的时候,你可以传递过去一个 CFLocaleRef,并且如果方法中的参数是 CGLocaleRef 参数,你可以传递过去一个 NSLocale 实例。
- NSRunLoop:
- NSRunLoop 类的声明是对于输入源的面向对象的编程思想。一个NSRunloop 对象处理着来自窗口系统、NSPort 对象和 NSConnection 对象的像鼠标或键盘事件的输入源。一个 NSRunloop 对象也能够处理 NSTimer 事件。
- 你的应用不能够创建或者显示的管理 NSRunLoop 对象。每个 NSThread 对象,包括应用的主线程,都有一个 NSRunLoop 对象由于需求被自动的创建。如果你需要访问当前线程的 run loop,你可以对 currentRunLoop 类做操作。
- 注意从 NSRunLoop的角度来看, NSTimer 对象并不是“输入源” - 他们是一种特殊类型,这意味着它们不会在触发的时候引起 run loop 返回。
注意: NSRunLoop 类一般不认为是线程安全的,其方法应该只在其当前的线程上下文中被调用。你不能尝试在别的线程中去调用 NSRunLoop 对象的方法,如果这样做将导致无法预料的结果。
小结
- 在动画中最好用CADisplayLink,因为由于每秒的刷新频率较高,所以用它所生成的动画会显得非常流畅。
iOS - CADisplayLink与NSTimer的更多相关文章
- iOS开发中深入理解CADisplayLink和NSTimer
一.什么是CADisplayLink 简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕. CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一 ...
- 深入理解CADisplayLink和NSTimer
一.什么是CADisplayLink 简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕. CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一 ...
- iOS 中的 NSTimer
iOS 中的 NSTimer NSTimer fire 我们先用 NSTimer 来做个简单的计时器,每隔5秒钟在控制台输出 Fire .比较想当然的做法是这样的: @interface Detail ...
- CADisplayLink、NSTimer循环引用解决方案
前言:CADisplayLink.NSTimer 循环引用问题 CADisplayLink.NSTimer会对Target产生强引用,如果target又对他们产生强引用,那么就会引发循环引用. @ ...
- iOS开发--计时器-NSTimer与CADisplayLink
如果程序要让某个方法重复执行,可以借助定时器来完成.CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器,NSTimer的精确度低了点,比如NSTimer的触发时间 ...
- ios 中定时器:NSTimer, CADisplayLink, GCD
#import "ViewController.h" #import "RunloopViewController.h" @interface ViewCont ...
- iOS中的NSTimer 和 Android 中的Timer
首先看iOS的, Scheduling Timers in Run Loops A timer object can be registered in only one run loop at a t ...
- IOS中的NSTimer定时器详解
/* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...
- [置顶] ios 时间定时器 NSTimer应用demo
原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9251917 demo功能:ios NSTimer应用demo .ipho ...
随机推荐
- IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法
这个世界变化很快,IE8也快出来了,它将不在支持以前{filter:alpha(opacity=50);}的私有属性,转而支持更规范的私有属性-ms-filter: “progid:DXImageTr ...
- 为什么要baidu/Google问题 尽量少在群里问问题
群里问也是可以的 但是 不能指望群里的人详细的回答 有时候的回答会很到位 但是 也可以 应该更多的去网络上搜索信息 因为 那是别人已经写好的 我们为什么不顺便去获取呢 别人花费了精力 我们要尽量运用 ...
- Selenium Grid Configuration
Start Hub and Node with Json config 1. Start Hub with json config file title HubWebDriver java -jar ...
- reveal 1.6.3 本机破解及使用
reveal 强大的iOS UI调试工具 1: 去官网下载最新版本:1.6.3 http://revealapp.com/download/ 2: 安装到mac上,即,解压下载的包,把app拖到mac ...
- ajax的详细学习
地址:http://www.cnblogs.com/Garden-blog/archive/2011/03/11/1981778.html
- Machine Learning for hackers读书笔记(三)分类:垃圾邮件过滤
#定义函数,打开每一个文件,找到空行,将空行后的文本返回为一个字符串向量,该向量只有一个元素,就是空行之后的所有文本拼接之后的字符串 #很多邮件都包含了非ASCII字符,因此设为latin1就可以读取 ...
- 【CodeForces 651B】Beautiful Paintings 排序+贪心
题目大意: 给定集合,对于任意一个的排列,记,求. 很明显每次搞出一个长度为的最长上升序列,然后把元素给删掉,答案增加. 直接暴力需要. 但是可以进行优化. 设有个,将个数从小到大排序,记为长度为的数 ...
- 关于MySQL回滚机制
在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚.回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行up ...
- android AutoCompleteTextView 自定义BaseAdapter
最近项目中需要做搜索功能,实现类似 Google.Baidu 搜索的 下拉提示效果.Android为我们提供了 AutoCompleteTextView 控件来完成此功能. 网上好多例子都是简单使用 ...
- 南阳OJ----Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alp ...