NSTimer没有开火

时间:2011-07-19 18:32:29

标签: objective-c cocoa macos nsdate nstimer

我有一个NSTimer,我使用此代码初始化:

testTimer = [[NSTimer alloc] initWithFireDate:[new objectAtIndex:0] interval:0.0 target:self selector:@selector(works:) userInfo:nil repeats:NO];

[new objectAtIndex:0]过去是一个NSDate。

当我启动应用程序时,计时器正在创建,其中fireDate立即生效(因为日期是过去的),但它从不调用我的工作方法。 (-(void)works:(id)sender

有人知道为什么会这样吗?

3 个答案:

答案 0 :(得分:18)

如果使用initWith..方法创建计时器对象,则必须将其添加到当前运行循环中。

NSRunLoop * theRunLoop = [NSRunLoop currentRunLoop];
[theRunLoop addTimer:testTimer forMode:NSDefaultRunLoopMode];

或者,如果您希望为您设置,请使用scheduled...方法创建计时器。

答案 1 :(得分:14)

我刚刚遇到NSTimer的问题。在我的情况下,我没有意识到方法scheduledTimerWithTimeInterval不是多线程安全的。一旦我将计时器移动到主线程,它就开始工作了。

答案 2 :(得分:2)

我认为我和Dobler有同样的问题,但我的解决方案却有所不同。

问题是计时器是在

中的块中的GCD线程中创建和调度的
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})

电话(实际上是嵌套的,因此事实并非如此)。

使用NSTimer's scheduledTimerWithTimeInterval:...将计时器置于无效的运行循环中。

修复方法是改为

timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(...) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];