【问题标题】:Improper behavior of NSTimer on separate threadNSTimer 在单独线程上的不当行为
【发布时间】:2011-05-24 10:44:09
【问题描述】:

我正在尝试将 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 第一次被正确调用。 Spinner 第一次旋转。但是当我停止我的微调器并重新启动它时,微调器不旋转。日志说第二次我的“startSpinner”方法被调用但“timerFireMethod”方法没有被调用。

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

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

【问题讨论】:

  • 如果新线程的唯一原因是运行计时器,只需将其安排在主运行循环中 - 参见这篇文章:stackoverflow.com/questions/2715844/…
  • 这行得通。但是我在一个单独的线程上安排定时器,因为定时器触发间隔是 0.001 秒。在主线程上它看起来很不稳定。
  • 对。如何让您的 NSTimer 实例变量成为类变量(在您的 @interface 部分中定义)。当您使其无效时,立即将其设置为nil。然后重启看看能不能用?好奇。
  • @petert,这也有效!!我可能想用其他方法使我的计时器无效,所以我不得不这样做。 @Deepak,您的意思是 timerFireMethod 中的更新?
  • 好的,很高兴知道。在线快速搜索证实了这种方法 - 如果您满意,请标记为答案。

标签: iphone nstimer nsthread nsrunloop


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2018-07-15
    • 2014-02-16
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多