調用一次計時器方法:
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>