NSTimer代码永远执行

时间:2012-02-04 12:13:23

标签: objective-c ios

这是我的代码。我预计计时器会在启动后5秒内停止,但事实并非如此。这有什么不对?

-(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");
}

4 个答案:

答案 0 :(得分:2)

NSDate的timeIntervalSinceReferenceDate默认情况下返回2001年1月1日。减去相同的值将始终为0.

Apple的文档: 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");
}

答案 1 :(得分: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");
    }
}

答案 2 :(得分:0)

你的时差总是0,所以你永远不会让它失效!

在设置计时器之前尝试设置startTime。

答案 3 :(得分:0)

您获得'startTime'值,并且您比较它的值是相同的。您的计算将始终为0.您必须在loadView方法中存储'startTime',然后在计算中使用它。