继续运行NSTimer切换背景和前景
我正在尝试创build一个NSTimer,由用户在前台手动启动,并且如预期的那样完美地工作:
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true)
其中updateCounter()
只是更新UI中的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
。
现在这是否意味着我需要使用这个vc或另一个方法,从前台停止的确切时间开始另一个NSTimer
(因为应用程序进入了后台)?
如果是的话,当用户再次打开应用程序时,恢复我的第一个NSTimer
(又意味着前景:D)我应该如何performance? 停止第二个NSTimer
并用更新的计数器恢复第一个NSTimer
?
其实,即使是解决scheme草图,我只是想弄清楚如何处理这个情况。
进一步的问题 :如果上面写的是正确的,当从后台切换到前台或反之亦然时,如何pipe理viewcontroller
的实例以获取timer_value
(像secondsLeft
这样的secondsLeft
)?
而不是试图在后台维护一个NSTimer
(这是不可能超过10分钟),你想要做的就是logging你的计时器启动并保存在NSUserDefaults
。 您仍然可以每秒更新计时器,但是只需根据开始时间重新计算标签(请记住, NSTimer
不会保证它会按时运行;可能由于许多原因而迟到,您将会漂移)。
现在没有理由在后台运行。 当你的视图控制器出现在屏幕上时( viewDidAppear:
NSUserDefaults
,只需要根据NSUserDefaults
保存的开始时间再次更新标签。
iOS无法在后台无限期运行。 这是devise。 但是当你不在屏幕上时,你也没有理由浪费系统资源来更新你的用户界面。 只是在你更新的时候。