2012-02-04 54 views
1

這是我的代碼。我希望計時器在啓動後5秒內停止,但不啓動。這裏有什麼問題?NSTimer代碼永遠執行

-(void)loadView 
{ 
NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate]; 



NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.0 
           target:self 
           selector:@selector(targetMethod:) 
           userInfo:nil 
           repeats:YES]; 
if([NSDate timeIntervalSinceReferenceDate] - startTime >= 5) { 
    [timer invalidate]; 
} 

} 

-(void)targetMethod:(NSTimer *)timer { 


    NSLog(@"bla"); 
} 
+0

你似乎誤會NSTimer'如何'的作品,因爲在'targetMethod代碼:'沒有任何意義。正在嘗試做什麼? – Costique 2012-02-04 12:20:50

+0

我忘了添加targetMethod。請參閱更新的版本。 – objlv 2012-02-04 12:22:48

回答

2

的NSDate的timeIntervalSinceReferenceDate是,默認情況下,返回1月1日,2001年減去相同的值將始終爲0

蘋果的文檔: https://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

這裏有一個想法: 在你的.h

@interface MyClass : NSObject 

@property (nonatomic, retain) NSTimer *timer; 

- (void)targetMethod:(NSTimer *)timer; 
- (void)cancelTimer; 

@end 

在您的m

@implementation MyClass 

@synthesize timer; 

-(void)loadView 
{ 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.0 
              target:self 
              selector:@selector(targetMethod:) 
              userInfo:nil 
              repeats:YES]; 
    [self performSelector:@selector(cancelTimer) withObject:nil afterDelay:5.0]; 
} 

-(void)cancelTimer { 
    [self.timer invalidate]; 
} 

-(void)targetMethod:(NSTimer *)timer { 
    NSLog(@"bla"); 
} 
+0

那麼,在啓動5秒後停止計時器該怎麼做? – objlv 2012-02-04 12:21:32

+0

我把代碼放在那裏來演示。 startTime將需要作爲NSTimeInterval的類的屬性。 – 2012-02-04 12:26:21

+0

我試過你的代碼,但它仍然輸出bla字符串。定時器不停止。 – objlv 2012-02-04 12:34:18

0

你的時差總是0,所以你永遠不會使它失效!

嘗試在設置計時器之前設置startTime。

+0

仍然不起作用。請參閱更新代碼 – objlv 2012-02-04 12:20:18

+0

您需要屬性變量中的startTime。而你的計時器代碼應該放在名爲targetMethod的方法中: – peterept 2012-02-04 12:23:20

0

你得到'startTime'的值,你比較它的值是相同的。您的計算將始終爲0.您必須將「startTime」存儲在loadView方法中,然後在計算中使用它。

1

這是短期和簡單:

NSDate *endtime = [NSDate dateWithTimeIntervalSinceNow:5]; 
[NSTimer scheduledTimerWithTimeInterval:1 
     target:self 
     selector:@selector(timerTick:) 
     userInfo:endtime 
     repeats:YES]; 


-(void)timerTick:(NSTimer*)timer 
{ 
    NSLog(@"timer tick"); 
    if ([timer.userInfo timeIntervalSinceNow] < 0) 
    { 
     [timer invalidate]; 
     NSLog(@"invalidating timer"); 
    } 
}