【问题标题】:How can I invalidate the timer when timer going in Background?当计时器进入后台时,如何使计时器无效?
【发布时间】:2011-11-15 06:27:31
【问题描述】:

在我的应用中,我使用了计时器,

当第一次启动计时器时,我想在它进入后台时停止该计时器,

所以我用这段代码来停止计时器,

 - (void)applicationWillEnterForeground:(UIApplication *)application
{
  FirstViewController *view = [[FirstViewController alloc]init];
 [view.myticker invalidate];    //myticker is timer
    view.myticker = nil;
 [view release];
}

我在前台委托方法调用时使计时器无效,

但是当来到视图控制器时,旧计时器仍在运行,

当计时器进入后台时如何使计时器无效?

【问题讨论】:

  • 快速检查:确保 view.myticker 不是 nil 并在您的 applicationWillEnterForeground 方法中进行 NSLog 检查,然后再尝试使其无效
  • 我已经检查过当它进入后台时 Timer 不是 nil。之后我尝试 nil 一个 Timer。

标签: iphone objective-c cocoa-touch ios4 nstimer


【解决方案1】:

没有必要将你的计时器移到你的委托人身上,事实上这是一个非常糟糕的主意,因为它没有任何目的!

您应该注意以下通知(取决于操作系统版本,后者在 OS4+ 中)...

UIApplicationWillResignActiveNotification UIApplicationDidEnterBackgroundNotification

从您的视图控制器中观察这些并使计时器无效。应用再次启动时有相应的通知...

UIApplicationDidBecomeActiveNotification UIApplicationWillEnterForegroundNotification

【讨论】:

    【解决方案2】:

    AppDelegate 方法中声明你的NSTimer 变量并合成它。然后使用 AppDelegate 的sharedApplication,在整个项目中使用该变量,不要创建任何新变量。还要对同一个实例变量执行invalidate 方法。

    【讨论】:

      【解决方案3】:

      在一个全局文件中创建一个时间。

      在应用委托方法中,

      - (void)applicationDidEnterBackground:(UIApplication *)application {
      
          NSTimer *t ;
          if ([t isValid]) {
              [t invalidate];
          }
      
      }
      

      使用上述代码将帮助您在应用程序进入后台时停止计时器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多