標籤:style blog class code tar int
調用一次計時器方法:
?
1 2 |
myTimer = [ NSTimer scheduledTimerWithTimeInterval:1.5 target: self selector: @selector (scrollTimer) userInfo: nil repeats: NO ]; //不重複,只調用一次。timer運行一次就會自動停止運行 |
重複調用計時器方法:
?
1 2 |
timer = [ NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector (function:) userInfo: nil repeats: YES ]; //每1秒運行一次function方法。 <span style="line-height: 1.5;"> </span> |
注意:將計數器的repeats設定為YES的時候,self的引用計數會加1。因此可能會導致self(即viewController)不能release,所以,必須在viewWillAppear的時候,將計數器timer停止,否則可能會導致記憶體泄露。
停止timer的運行,但這個是永久的停止:
?
1 2 |
//取消定時器 [timer invalidate]; |
要想實現:先停止,然後再某種情況下再次開啟運行timer,可以使用下面的方法:
首先關閉定時器不能使用上面的方法,應該使用下面的方法:
?
1 2 |
//關閉定時器 [myTimer setFireDate:[ NSDate distantFuture]]; |
然後就可以使用下面的方法再此開啟這個timer了:
?
1 2 |
//開啟定時器 [myTimer setFireDate:[ NSDate distantPast]]; |
例子:比如,在頁面消失的時候關閉定時器,然後等頁面再次開啟的時候,又開啟定時器。
(主要是為了防止它在後台運行,暫用CPU)可以使用下面的代碼實現:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//頁面將要進入前台,開啟定時器 -( void )viewWillAppear:( BOOL )animated { //開啟定時器 [scrollView.myTimer setFireDate:[ NSDate distantPast]]; } //頁面消失,進入後台不顯示該頁面,關閉定時器 -( void )viewDidDisappear:( BOOL )animated { //關閉定時器 [scrollView.myTimer setFireDate:[ NSDate distantFuture]]; } |
OK,搞定。
官方介面
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@interface NSTimer : NSObject //初始化,最好用scheduled方式初始化,不然需要手動addTimer:forMode: 將timer添加到一個runloop中。 + ( NSTimer *)timerWithTimeInterval:( NSTimeInterval )ti invocation:( NSInvocation *)invocation repeats:( BOOL )yesOrNo; + ( NSTimer *)scheduledTimerWithTimeInterval:( NSTimeInterval )ti invocation:( NSInvocation *)invocation repeats:( BOOL )yesOrNo; + ( NSTimer *)timerWithTimeInterval:( NSTimeInterval )ti target:( id )aTarget selector:( SEL )aSelector userInfo:( id )userInfo repeats:( BOOL )yesOrNo; + ( NSTimer *)scheduledTimerWithTimeInterval:( NSTimeInterval )ti target:( id )aTarget selector:( SEL )aSelector userInfo:( id )userInfo repeats:( BOOL )yesOrNo; - ( id )initWithFireDate:( NSDate *)date interval:( NSTimeInterval )ti target:( id )t selector:( SEL )s userInfo:( id )ui repeats:( BOOL )rep; - ( void )fire; //立即觸發定時器 - ( NSDate *)fireDate; //開始時間 - ( void )setFireDate:( NSDate *)date; //設定fireData,其實暫停、開始會用到 - ( NSTimeInterval )timeInterval; //延遲時間 - ( void )invalidate; //停止並刪除 - ( BOOL )isValid; //判斷是否valid - ( id )userInfo; //通常用nil @end |
暫停與繼續
?
1 2 3 |
[timer setFireDate:[ NSDate date]]; //繼續。 [timer setFireDate:[ NSDate distantPast]]; //開啟 [timer setFireDate:[ NSDate distantFuture]]; //暫停 |
使用NSTimer實現倒計時的一個例子:
-(void)viewDidLoad中添加如下代碼,每秒出發一次
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector (timerFireMethod:) userInfo: nil repeats: YES ]; - ( void )timerFireMethod:( NSTimer *)theTimer { NSCalendar *cal = [ NSCalendar currentCalendar]; //定義一個NSCalendar對象 NSDateComponents *endTime = [[ NSDateComponents alloc] init]; //初始化目標時間...奧運時間好了 [endTime setYear:2008]; [endTime setMonth:8]; [endTime setDay:8]; [endTime setHour:8]; [endTime setMinute:8]; [endTime setSecond:8]; NSDate *todate = [cal dateFromComponents:endTime]; //把目標時間裝載入date [endTime release]; NSDate *today = [ NSDate date]; //得到目前時間 //用來得到具體的時差 unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ; NSDateComponents *d = [cal components:unitFlags fromDate:today toDate:todate options:0]; NSLog (@ "%d年%d月%d日%d時%d分%d秒" ,[d year],[d month], [d day], [d hour], [d minute], [d second]); } |