0

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

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

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

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

并作废如下:

if(timer){

    [timer invalidate];
    timer = nil;


}

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

提前致谢。

4

4 回答 4

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调用时进行初始化。

希望这可以帮助 !

于 2012-06-07T09:04:20.927 回答
1

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

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

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

于 2012-06-07T05:20:41.653 回答
0

没有任何方法可以“恢复” NSTimer。您可以创建几个属性来跟踪创建计时器的日期(包括时间)以及调用屏幕 2 的时间。当您移至屏幕 2 时,使计时器无效,当您返回屏幕 1 时,获取 2 个日期对象之间的时间差,从轮询之间所需的时间中减去该时间差,然后使用该时间间隔创建一个新计时器。这对用户来说似乎是计时器的“恢复”。

于 2012-06-07T06:34:05.523 回答
0

我认为你应该对象retainNSTimer

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

并使之无效

if(timer){

    [timer invalidate];
    [timer release];
    timer = nil;
}
于 2012-06-07T06:46:39.350 回答