继续运行NSTimer切换背景和前景

时间:2015-02-12 18:58:24

标签: ios xcode swift background nstimer

我正在尝试创建一个NSTimer,它由用户在前台手动启动 ,正如预期的那样完美无缺:

timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true)

其中updateCounter()只是更新了用户界面中的UILabel。 现在我想要实现的是在用户离开应用程序时也让它运行。我google了一些东西,发现了这段代码(我在Swift中翻译过):

func applicationDidEnterBackground(application: UIApplication) {
            var bgTask = UIBackgroundTaskIdentifier()
            bgTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { () -> Void in
                UIApplication.sharedApplication().endBackgroundTask(bgTask)
            }
            // Start the long-running task and return immediately.
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in



               var vc = TimerViewController()
               // Fire some methods
               UIApplication.sharedApplication().endBackgroundTask(bgTask)
               bgTask = UIBackgroundTaskInvalid
               });
        }

基本上我从这里可以理解的是,当应用程序达到后台时,我可以从我的TimerViewController()的新实例中激活一些方法,该实例应该为后台阶段处理NSTimer。 / p>

现在这意味着我需要使用此vc或其他方法中的一个方法,该方法从前景一个停止的确切时间开始另一个NSTimer(因为app进入后台)? / p>

如果是,请在用户再次打开应用时恢复我的第一个NSTimer(意味着前景:D)我该怎么做?停止第二个NSTimer并使用更新的计数器恢复第一个?

实际上,即使是解决方案的草图,我也只是想弄清楚如何处理这种情况。

进一步的问题:如果上面写的内容证明是正确的,我如何管理viewcontroller的实例以获取timer_value(令牌)对于像secondsLeft这样的东西,当从背景切换到前景或反之亦然时?

1 个答案:

答案 0 :(得分:6)

您不想尝试在后台维护NSTimer(大约10分钟以内不可能),您要做的就是在计时器启动时进行记录并将其保存在NSUserDefaults中。您仍然可以每秒更新您的计时器,但只需根据开始时间重新计算标签(请记住,NSTimer并不保证它会按时运行;它可能会因为很多原因而延迟,您会漂移)。

现在没有理由在后台运行。当您的视图控制器出现在屏幕上时(viewDidAppear:),只需根据NSUserDefaults中保存的开始时间再次更新标签。

iOS无法在后台无限期运行。这是设计的。但是,当您不在屏幕上时,也没有理由浪费系统资源来尝试更新UI。只是在你的时候更新它。