继续运行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。 但是当你不在屏幕上时,你也没有理由浪费系统资源来更新你的用户界面。 只是在你更新的时候。