我正在尝试创建一个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
这样的东西,当从背景切换到前景或反之亦然时?
答案 0 :(得分:6)
您不想尝试在后台维护NSTimer
(大约10分钟以内不可能),您要做的就是在计时器启动时进行记录并将其保存在NSUserDefaults
中。您仍然可以每秒更新您的计时器,但只需根据开始时间重新计算标签(请记住,NSTimer
并不保证它会按时运行;它可能会因为很多原因而延迟,您会漂移)。
现在没有理由在后台运行。当您的视图控制器出现在屏幕上时(viewDidAppear:
),只需根据NSUserDefaults
中保存的开始时间再次更新标签。
iOS无法在后台无限期运行。这是设计的。但是,当您不在屏幕上时,也没有理由浪费系统资源来尝试更新UI。只是在你的时候更新它。