我将描述我的情景:
每当用户登录应用时,我都会加载UIViewController
,因为它会管理用户登录后始终显示的UIView
。UIView
消失时用户注销。此UIViewController
已声明@property (strong, nonatomic) NSTimer *timer;
。我希望这个计时器向用户显示可能需要几分钟的倒计时。每当显示UIView
时,该计时器应该开始,并且每20秒重新开始计数,以便每20秒刷新一次倒计时,直到达到0:
-(void)start
{
if (self.timer != nil) {
[self.timer invalidate];
self.timer = nil;
}
// Some operations here
self.countdown = untilTime; // countdown total secs
self.timer = [NSTimer scheduledTimerWithTimeInterval:20
target:self
selector:@selector(notifyTimerTick:)
userInfo:nil
repeats:YES];
}
- (void)notifyTimerTick:(NSTimer *)timer
{
self.countdown -= 20;
if (self.countdown <= 0) {
[self start];
}
[self updateCountdown]; // Countdown label shown to user
}
也就是说,每当倒计时达到0时,新的倒计时再次开始N分钟,具体取决于我在-(void)start
方法中执行的某些操作。只要用户登录应用程序,此方案就应该继续有效。
在AppDelegate
中,当应用变为非活动状态或进入后台(或用户注销)时,我会停止此计时器:
- (void)applicationWillResignActive:(UIApplication *)application
{
if (isUserLogged) {
[self.countdownViewController stopTimer];
}
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (isUserLogged) {
[self.countdownViewController stopTimer];
}
}
stopTimer
方法是这样的:
- (void)stopTimer
{
if (self.timer != nil) {
[self.timer invalidate];
self.timer = nil;
}
}
我通过调用我已经描述过的applicationDidBecomeActive:
方法再次以-(void)start
方法重新启动计时器,我也在用户登录应用程序时调用该方法。
这对我来说有95%的时间,但我在测试期间发现了几次,有时候倒计时的速度比它应该的要快。我的意思是,例如:如果倒计时需要6分钟,我上次看到这个奇怪的效果时花了大约3分钟达到0值,并且向用户显示的倒计时也更快地更新。这就像有多个计时器执行倒计时,但我不明白为什么,因为它通常工作正常,我没有找到导致这种情况的原因。
我在真正的iOS 7设备中测试应用的测试版时发现了这个快速倒计时。当我想看看发生了什么,并且我将设备连接到Xcode
和Instruments
时,应用程序启动导致计时器再次正常工作,因此我无法在“工具”中调试或查看任何内容这种情况。
我想我正确管理计时器,我错过了什么?有人经历过这样的事吗?我已经阅读了一些关于发布计时器的帖子,但是他们只是说你必须使计时器无效而且我已经这样做了:
Correct way to release NSTimer?
我需要帮助来分析这个问题。非常感谢提前
编辑:我的代码是否确保只能运行一个NSTimer
对象?我应该在dealloc
方法中管理与计时器相关的内容吗?