NSTimer在单独线程上的不正确行为

时间:2011-05-24 10:44:09

标签: iphone nstimer nsthread nsrunloop

我正在尝试在单独的线程上安排NSTimer,这就是我的工作方式。

-(void) startSpinner {
#ifdef DEBUG_MODE
    NSLog(@"Starting Spinner...");
#endif
    self.spinnerThread = [[[NSThread alloc] initWithTarget:self selector:@selector(scheduleSpinner) object:nil] autorelease];
    [spinnerThread start];
}

-(void) scheduleSpinner {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSTimer *_spinTimer = [NSTimer scheduledTimerWithTimeInterval:SPIN_FIRE_INTERVAL target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:_spinTimer forMode:NSRunLoopCommonModes];
    [runLoop addTimer:_spinTimer forMode:UITrackingRunLoopMode];
    [runLoop run];

    [pool release];
}

timerFireMethod旋转我的微调器,当按下一个按钮(停止按钮)时,我使计时器无效并以此方法退出线程。如果按下旋转按钮,我会在这里进行轮询。

问题是,我的timerFireMethod第一次被正确调用。旋转器第一次旋转。但当我停止我的旋转器再次启动时,旋转器不会旋转。日志说第二次我的" startSpinner"方法被调用,但" timerFireMethod"方法未被调用。

更糟糕的是,微调器在模拟器上工作5-6次,在2g器件上工作1次,在最新ipod上工作4-5次。它是随机的。

这基本上如何运作?可能是什么问题?

1 个答案:

答案 0 :(得分:0)

使您的NSTimer实例变量成为类变量。当您将其无效时,请立即将其设置为nil