2012-02-04 53 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"); 
    } 
}