【点杀iOS】NSTimer的基本使用

1.背景介绍:NSTimer是什么鬼

这货大家从它的『脸』估计就能知道它是啥东西了,是的,计时器。但是,如果你说NSTimer就是计时器,肯定会有人说你太业余,叫法不准确,然后以一个大牛的姿态说一些正常人听不懂的并且带有讽刺味道的话。呵呵,这都不重要,因为大家都是被大牛虐出来的,今后也会去虐别人。重要的是NSTimer能干什么,这才是我们关心的,至于它的定义或者概念是什么,还是交给英语系的童鞋去操心吧。所以,在介绍NSTimer的功能之前,我们还姑且就把它叫做计时器吧,它能做的就是从现在开始到后面的某一个时刻或者周期性的执行我们指定的方法的对象。

2.使用NSTimer之前要了解的知识

(1)NSTimer有以下两个常用的方法

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

创建一个计时器,参数1:时间间隔(秒),参数2:表示发送的对象(一般填self),参数3:要执行的方法,参数4:传递信息(可以以字典的形式,将信息传递给要执行的方法),参数5:是否重复执行,如果NO,timer执行一次后便失效。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

创建一个计时器,参数1:时间间隔(秒),参数2:表示发送的对象(一般填self),参数3:要执行的方法,参数4:传递信息(可以以字典的形式,将信息传递给要执行的方法),参数5:是否重复执行,如果NO,timer执行一次后便失效。

 

大家可能发现了,第一个方法和第二个方法貌似是一样的?是的,他们基本是一样的,但是也是有一些区别的,继续向下看,你会知道它们的不同之处的。

(2)运行循环RunLoop

不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生。给我们的感觉就像应用一直处于随时待命的状态,在没人操作的时候它一直在休息,在让它干活的时候,它就能立刻响应。其实,这就是run loop的功劳。(此段话寨子CSDN)

大家可以把运行循环理解成一个系统级的线程,它时刻在监听着系统各种事件,一旦有事件发生,他就会触发处于运行循环中的程序。NSTimer也一样,只有加入运行循环中才能正常运行。但是,加入运行循环也是分好多种情况的,就像我们去上班,高富帅开车去,普通青年做地铁去,文艺青年不去。NSTimer加入运行循环常见的有两种模式,第一种是默认模式(NSDefaultRunLoopModel),第二种是(NSRunLoopCommonModels)。

(3)timerWithTimeInterval和scheduledTimerWithTimeInterval的区别

知道了运行循环的两种模式,我们就能说清楚这两个方法有什么区别了。scheduledTimerWithTimeInterval方法创建完timer之后,会自动以NSDefaultRunLoopModel模式加入运行循环。而timerWithTimeInterval方法创建的timer,不会自动加入运行循环,需要我们手动指定模式,并手动加入运行循环。

至于这两种模式又有什么不同,接下来我们会通过代码得到答案。

3.一些例子

例1:

 

以上例子说明:scheduledTimerWithTimeInterval方法创建timer后,即可加入运行循环进行执行,userinfo信息可通过参数携带到方法中。

例2:

同样是上述代码,我们在界面中加入了textView控件,在计时器执行的过程中,我们拖动textView控件,发现计时器会中断,停止拖动textView后,计时器继续执行。

以上代码说明,在默认模式下(NSDefaultRunLoopModel),当有滚动事件发生,运行循环就会暂时停止NSTimer的执行,当滚动事件结束后,再继续执行NSTimer计时器。那么,在另外一种模式(NSRunLoopCommonModels)下又会是怎样的呢。我们一起再来看看,当然,想要使用NSRunLoopCommonModels模式,我们就要用timerWithTimeInterval方法来创建timer了。

例3:

在上述代码中我们发现,在NSRunLoopCommonModels模式下,无论我们怎么滚动视图,NSTimer也会正常执行的。

以上例子说明了这两种模式表现出来的现象,其实这两种模式的区别是:

NSDefaultRunLoopModel:监听用户最基本的操作(点击,触摸等)

NSRunLoopCommonModels:监听一些特殊操作:滚动等

那么,为什么在NSDefaultRunLoopModel模式下发生滚动,计时器会停止呢?那是因为系统认为,用户不应该边滚动边操作界面,所以停止了(触碰,点击等)NSDefaultRunLoopModel模式下监听的事件。

 

4.使用NSTimer是不准确的计时

假设NSTimer要执行 A,B,C,D四个任务,当执行到B的时候被中断,那么,当NStimer获得继续执行的权利之后,会把B,C一起执行。换句话说,NSTimer不会遗漏任务,但也无法保证按时准确执行任务。那么,ios中怎么保证准时执行任务呢?一般情况下,我们会使用CADisplayLink。它会在屏幕每次刷新时执行一次。而屏幕的刷新频率每秒要达到几十次,从而保证的时间的准确性。

 

以上内容是个人对NSTimer肤浅的认识,今后如果有进一步的了解,还会对文章进行更新。欢迎大家批评指正。

(完)

 

转载于:https://www.cnblogs.com/hellomeng/p/4729751.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值