天天看点

IOS中定时器NSTimer的开启与关闭

调用一次计时器方法:

1

2

<code>mytimer = [</code><code>nstimer</code>

<code>scheduledtimerwithtimeinterval:1.5 target:</code><code>self</code>

<code>selector:</code><code>@selector</code><code>(scrolltimer) userinfo:</code><code>nil</code>

<code>repeats:</code><code>no</code><code>]; </code>

<code>//不重复,只调用一次。timer运行一次就会自动停止运行</code>

重复调用计时器方法:

<code>timer =  [</code><code>nstimer</code>

<code>scheduledtimerwithtimeinterval:1.0 target:</code><code>self</code>

<code>selector:</code><code>@selector</code><code>(function:) userinfo:</code><code>nil</code>

<code>repeats:</code><code>yes</code><code>]; </code>

<code>//每1秒运行一次function方法。  &lt;span style="line-height: 1.5;"&gt;  &lt;/span&gt;</code>

注意:将计数器的repeats设置为yes的时候,self的引用计数会加1。因此可能会导致self(即viewcontroller)不能release,所以,必须在viewwillappear的时候,将计数器timer停止,否则可能会导致内存泄露。

停止timer的运行,但这个是永久的停止:

<code>//取消定时器 </code>

<code>[timer invalidate];</code>

要想实现:先停止,然后再某种情况下再次开启运行timer,可以使用下面的方法:

首先关闭定时器不能使用上面的方法,应该使用下面的方法:

<code>//关闭定时器 </code>

<code>[mytimer setfiredate:[</code><code>nsdate</code>

<code>distantfuture]];</code>

然后就可以使用下面的方法再此开启这个timer了:

<code>//开启定时器 </code>

<code>distantpast]];</code>

例子:比如,在页面消失的时候关闭定时器,然后等页面再次打开的时候,又开启定时器。

(主要是为了防止它在后台运行,暂用cpu)可以使用下面的代码实现:

3

4

5

6

7

8

9

10

11

12

13

<code>//页面将要进入前台,开启定时器 </code>

<code>-(</code><code>void</code><code>)viewwillappear:(</code><code>bool</code><code>)animated </code>

<code>{ </code>

<code>    </code><code>//开启定时器 </code>

<code>    </code><code>[scrollview.mytimer setfiredate:[</code><code>nsdate</code>

<code>distantpast]]; </code>

<code>} </code>

<code>  </code> 

<code>//页面消失,进入后台不显示该页面,关闭定时器 </code>

<code>-(</code><code>void</code><code>)viewdiddisappear:(</code><code>bool</code><code>)animated </code>

<code>    </code><code>//关闭定时器 </code>

<code>distantfuture]]; </code>

ok,搞定。

官方接口

14

15

16

17

18

19

20

21

22

23

<code>@interface</code>

<code>nstimer</code> <code>:</code><code>nsobject</code>

<code>//初始化,最好用scheduled方式初始化,不然需要手动addtimer:formode: 将timer添加到一个runloop中。</code>

<code>+ (</code><code>nstimer</code>

<code>*)timerwithtimeinterval:(</code><code>nstimeinterval</code><code>)ti invocation:(</code><code>nsinvocation</code>

<code>*)invocation repeats:(</code><code>bool</code><code>)yesorno;</code>

<code>*)scheduledtimerwithtimeinterval:(</code><code>nstimeinterval</code><code>)ti invocation:(</code><code>nsinvocation</code>

<code>*)timerwithtimeinterval:(</code><code>nstimeinterval</code><code>)ti target:(</code><code>id</code><code>)atarget selector:(</code><code>sel</code><code>)aselector userinfo:(</code><code>id</code><code>)userinfo repeats:(</code><code>bool</code><code>)yesorno;</code>

<code>*)scheduledtimerwithtimeinterval:(</code><code>nstimeinterval</code><code>)ti target:(</code><code>id</code><code>)atarget selector:(</code><code>sel</code><code>)aselector userinfo:(</code><code>id</code><code>)userinfo repeats:(</code><code>bool</code><code>)yesorno;</code>

<code>- (</code><code>id</code><code>)initwithfiredate:(</code><code>nsdate</code>

<code>*)date interval:(</code><code>nstimeinterval</code><code>)ti target:(</code><code>id</code><code>)t selector:(</code><code>sel</code><code>)s userinfo:(</code><code>id</code><code>)ui repeats:(</code><code>bool</code><code>)rep;</code>

<code>- (</code><code>void</code><code>)fire; </code><code>//立即触发定时器</code>

<code>- (</code><code>nsdate</code>

<code>*)firedate;</code><code>//开始时间</code>

<code>- (</code><code>void</code><code>)setfiredate:(</code><code>nsdate</code>

<code>*)date;</code><code>//设置firedata,其实暂停、开始会用到</code>

<code>- (</code><code>nstimeinterval</code><code>)timeinterval;</code><code>//延迟时间</code>

<code>- (</code><code>void</code><code>)invalidate;</code><code>//停止并删除</code>

<code>- (</code><code>bool</code><code>)isvalid;</code><code>//判断是否valid</code>

<code>- (</code><code>id</code><code>)userinfo;</code><code>//通常用nil</code>

<code>@end</code>

暂停与继续

<code>[timer setfiredate:[</code><code>nsdate</code>

<code>date]];</code><code>//继续。</code>

<code>distantpast]];</code><code>//开启</code>

<code>distantfuture]];</code><code>//暂停</code>

  

使用nstimer实现倒计时的一个例子:

-(void)viewdidload中添加如下代码,每秒出发一次

24

<code>[</code><code>nstimer</code>

<code>selector:</code><code>@selector</code><code>(timerfiremethod:) userinfo:</code><code>nil</code>

<code>repeats:</code><code>yes</code><code>];</code>

<code>- (</code><code>void</code><code>)timerfiremethod:(</code><code>nstimer</code><code>*)thetimer</code>

<code>{</code>

<code>    </code><code>nscalendar</code>

<code>*cal = [</code><code>nscalendar</code>

<code>currentcalendar];</code><code>//定义一个nscalendar对象</code>

<code>    </code><code>nsdatecomponents</code>

<code>*endtime = [[</code><code>nsdatecomponents</code>

<code>alloc] init];   </code><code>//初始化目标时间...奥运时间好了</code>

<code>    </code><code>[endtime setyear:2008];</code>

<code>    </code><code>[endtime setmonth:8];</code>

<code>    </code><code>[endtime setday:8];</code>

<code>    </code><code>[endtime sethour:8];</code>

<code>    </code><code>[endtime setminute:8];</code>

<code>    </code><code>[endtime setsecond:8];</code>

<code>    </code> 

<code>    </code><code>nsdate</code>

<code>*todate = [cal datefromcomponents:endtime];</code><code>//把目标时间装载入date</code>

<code>    </code><code>[endtime release];</code>

<code>*today = [</code><code>nsdate</code>

<code>date];   </code><code>//得到当前时间</code>

<code>    </code><code>//用来得到具体的时差</code>

<code>    </code><code>unsigned</code><code>int</code>

<code>unitflags =</code><code>nsyearcalendarunit</code>

<code>|</code><code>nsmonthcalendarunit</code>

<code>|</code><code>nsdaycalendarunit</code>

<code>|</code><code>nshourcalendarunit</code>

<code>|</code><code>nsminutecalendarunit</code>

<code>|</code><code>nssecondcalendarunit</code><code>;</code>

<code>*d = [cal components:unitflags fromdate:today todate:todate options:0];</code>

<code>    </code><code>nslog</code><code>(@</code><code>"%d年%d月%d日%d时%d分%d秒"</code><code>,[d year],[d month], [d day], [d hour], [d minute], [d second]);</code>

<code>}</code>

继续阅读