NSTimer没有开火

时间:2012-02-19 05:43:27

标签: objective-c macos nstimer

对于我的生活,我无法弄清楚为什么这个NSTimer不会开火。这里是所有相关的代码(至少对我而言)

- (IBAction)connectClick:(id)sender
{
    if (connected)
    {
        NSLog(@"Disconnecting");
        [timer invalidate];
        timer = nil;
        connected = NO;
        [Connect setStringValue:@"Connect"];
        NSLog(@"Finished\n");
    }
    else
    {
        NSLog(@"Connecting");
        timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
        //[timer fire]; tested this line. same results
        [Connect setStringValue:@"a"]; 
        connected = YES;
        NSLog(@"Finished\n");
    }
}

- (void)timerFireMethod:(NSTimer*)theTimer
{
    NSLog(@"Fireing event");
    //[self resetRequest];
    //[spinner startAnimation:nil];
    //[request startAsynchronous];
}

我已阅读过苹果文档和其他问题,但我无法弄明白。它甚至没有调用timerDireMethod:一次。我听说这可能是由不同的线程引起的,但据我所知,我没有使用多个线程。

欢迎所有想法。

2 个答案:

答案 0 :(得分:9)

来自NSTimer documentation的Mac OS X:

  

您必须使用addTimer:forMode:将新计时器添加到运行循环中。   然后,经过几秒钟后,计时器触发,发送   消息aSelector来定位。 (如果计时器配置为重复,   没有必要随后将计时器重新添加到运行循环中。)

就个人而言,我通常使用+[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]

另请注意,如果在后台线程或后台队列中运行的块操作中调用此方法,则NSTimer会在后台线程执行时被销毁。因此,请确保在主线程或主队列中运行它,以适合您的情况。

答案 1 :(得分:1)

阅读您正在使用的方法的文档+timerWithTimeInterval:target:selector:userInfo:repeats:

  

您必须使用addTimer:forMode:将新计时器添加到运行循环中。   然后,经过几秒钟后,计时器触发,发送   消息aSelector来定位。