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

Iphone NSTimer在单独线程上的行为不正确,iphone,nstimer,nsthread,nsrunloop,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]; [spinne

我试图在一个单独的线程上安排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次。这是随机的


这基本上是如何工作的?有什么问题吗?

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

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

如果新线程的唯一原因是运行计时器,只需在主运行循环中安排它-请参阅本文:这是有效的。但是,我在一个单独的线程上安排计时器,因为计时器触发间隔是0.001秒。在主线程上,它看起来起伏不平。如何将您的
NSTimer
实例变量设置为类变量(在@interface部分中定义)。当您使其无效时,立即将其设置为
nil
。然后,如果重新启动它,看看它是否工作?好奇。@petert,这也行!!我可能想用其他方法使计时器失效,所以我不得不这样做@Deepak,你是说timerFireMethod中的更新?好的,很高兴知道。在线快速搜索证实了这一方法——如果你高兴的话,标记为答案。如果新线程的唯一原因是运行计时器,只需在主运行循环中安排它——请参阅本文:这很有效。但是,我在一个单独的线程上安排计时器,因为计时器触发间隔是0.001秒。在主线程上,它看起来起伏不平。如何将您的
NSTimer
实例变量设置为类变量(在@interface部分中定义)。当您使其无效时,立即将其设置为
nil
。然后,如果重新启动它,看看它是否工作?好奇。@petert,这也行!!我可能想用其他方法使计时器失效,所以我不得不这样做@Deepak,你是说timerFireMethod中的更新?好的,很高兴知道。在线快速搜索证实了这一方法——如果你高兴的话,标记作为答案。