NSTimer没有按预期重复

时间:2013-01-07 12:25:57

标签: ios objective-c nstimer repeat

  

可能重复:
  NSTimer timerWithTimeInterval: not working

在我的应用程序中,我有以下设置来运行NSTimer的操作:

在m。文件:

@implementation MYViewController {
      NSTimer *aTimer;
}

然后,当用户点击我的相关按钮时:

- (IBAction)userClick:(id)sender {
     aTimer = [NSTimer timerWithTimeInterval:1.0 
                                      target:self 
                                    selector:@selector(doSomethingWithTimer:) 
                                    userInfo:nil 
                                     repeats:YES]; 
     //[aTimer fire]; //NSTimer was fired just once.
}

我也有:

-(void)doSomethingWithTimer:(NSTimer*)timer {
     NSLog(@"something to be done");
}

我希望在领事中有一句话说"要做的事情"每一秒钟。计时器甚至不会被调用一次。我已经尝试使用[aTimer fire]来触发NSTimer,但它只触发一次并且不会像我期望的那样重复。

有人可以指导我如何处理这个问题吗?

3 个答案:

答案 0 :(得分:9)

使用

- (NSTimer *)scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

然后您不必手动将其添加到运行循环中。

答案 1 :(得分:4)

您需要将计时器添加到运行循环中:

[[NSRunLoop mainRunLoop] addTimer:aTimer forMode:NSDefaultRunLoopMode];

答案 2 :(得分:1)

这里的问题是范围。您的aTimer变量必须是一个字段,因此一旦您离开userClick方法就不会获得GC。

NSTimer *timer;

...

- (IBAction)userClick:(id)sender {
    if (timer != nil && [timer isValid]) {
        [timer invalidate];
        timer = nil;
    }
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                             target:self 
                                           selector:@selector(doSomethingWithTimer:) 
                                           userInfo:nil 
                                            repeats:YES]; 
}