调用一次计时器方法:
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方法。 <span style="line-height: 1.5;"> </span></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>