天天看點

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>

繼續閱讀