我有一个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
)
有人知道为什么会这样吗?
答案 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];