我正在创建一个游戏,在游戏中我需要一个计时器。
我工作得很好,但是当我滚动 map 时它会停止,然后当我完成滚动时它会再次开始。我用dispatch_async修复了这个问题。这是代码
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeNext) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
});
计时器:
__block NSTimer *timer;
但是,如果应用程序进入后台,我需要停止这次(当它激活时,它会再次启动)。
通过这种方式,我可以滚动 map ,并且计时器运行良好,我尝试:
- (void)timeNext {
[timer invalidate];
}
但没有成功。有人知道如何阻止它吗?或任何其他想法来完成这项任务?
最佳答案
不要在全局队列的线程上创建计时器,然后在该线程上启动运行循环。
只需在主线程(主运行循环)上创建计时器,并将其添加到跟踪运行循环模式即可。定时器可以添加到多种运行循环模式。
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeNext) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
关于ios - 使dispatch_async内的NSTimer失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16074489/