NSTimer - 创建多个实例

时间:2012-06-07 05:15:35

标签: iphone ios ipad nstimer polling

我有一个应用程序,定期轮询到服务器。使用计时器任务执行轮询。计时器只需要在一个屏幕上使用,所以当我移动到其他屏幕时,计时器无效。

我观察到有时候计时器会失效,但有时却没有。当它没有失效时,会继续创建多个实例。

我已按如下方式初始化计时器:

 timer = [NSTimer scheduledTimerWithTimeInterval: 2
                                         target: self
                                       selector: @selector(timerTask:)
                                       userInfo: nil
                                        repeats: YES];

并失效如下:

if(timer){

    [timer invalidate];
    timer = nil;


}

请帮忙,在这种情况下需要做些什么。

提前致谢。

4 个答案:

答案 0 :(得分:1)

您是否正在创建多个计时器?在上面发布的代码剪辑中,如果执行时已定义了计时器:

 timer = [NSTimer scheduledTimerWithTimeInterval: 2
                                     target: self
                                   selector: @selector(timerTask:)
                                   userInfo: nil
                                    repeats: YES];

对timer的任何进一步引用只会为您提供最新的引用,获取对原始引用的唯一方法是检查选择器中的参数,看它是否与您定义的计时器实例变量不同。

答案 1 :(得分:1)

您应该为startingstopping计时器创建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;
}