我有一个应用程序,定期轮询到服务器。使用计时器任务执行轮询。计时器只需要在一个屏幕上使用,所以当我移动到其他屏幕时,计时器无效。
我观察到有时候计时器会失效,但有时却没有。当它没有失效时,会继续创建多个实例。
我已按如下方式初始化计时器:
timer = [NSTimer scheduledTimerWithTimeInterval: 2
target: self
selector: @selector(timerTask:)
userInfo: nil
repeats: YES];
并失效如下:
if(timer){
[timer invalidate];
timer = nil;
}
请帮忙,在这种情况下需要做些什么。
提前致谢。
答案 0 :(得分:1)
您是否正在创建多个计时器?在上面发布的代码剪辑中,如果执行时已定义了计时器:
timer = [NSTimer scheduledTimerWithTimeInterval: 2
target: self
selector: @selector(timerTask:)
userInfo: nil
repeats: YES];
对timer的任何进一步引用只会为您提供最新的引用,获取对原始引用的唯一方法是检查选择器中的参数,看它是否与您定义的计时器实例变量不同。
答案 1 :(得分:1)
您应该为starting
和stopping
计时器创建2种不同的方法,如下所示。
-(void)startTimer {
if([timer isValid]) {
[timer invalidate];
timer = nil;
}
timer = [NSTimer scheduledTimerWithTimeInterval: 2
target: self
selector: @selector(timerTask:)
userInfo: nil
repeats: YES];
}
-(void)stopTimer {
if([timer isValid]) {
[timer invalidate];
timer = nil;
}
}
这允许你start
计时器,如果实例已经有效,它将使它失效并开始一个新计时器。停止它会使其无效,timer
已准备好在您的下一次startTimer
来电时初始化。
希望这有帮助!
答案 2 :(得分:0)
没有办法“恢复”NSTimer。您可以创建几个属性来跟踪创建计时器的日期(包括时间)以及调用屏幕2的时间。当您移动到屏幕2时,使计时器无效,当您返回到屏幕1时,获取2个日期对象之间的时间差,从轮询之间的时间减去该时间差,并创建具有该时间间隔的新计时器。这似乎是计时器对用户的“恢复”。
答案 3 :(得分:0)
我认为您应该retain
NSTimer
对象。
timer = [[NSTimer scheduledTimerWithTimeInterval: 2
target: self
selector: @selector(timerTask:)
userInfo: nil
repeats: YES] retain];
并使其无效
if(timer){
[timer invalidate];
[timer release];
timer = nil;
}