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

r4i*_*id4 2 xcode background nstimer ios swift

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

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

这里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
               });
        }
Run Code Online (Sandbox Code Playgroud)

基本上我从这里可以理解的是,当app到达背景时,我可以从我的一个新实例中激活一些方法TimerViewController(),这个方法应该处理NSTimer后台阶段.

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

如果是,请NSTimer在用户再次打开应用程序时重新启动我的第一个(意味着前景:D)我应该如何表现?停止第二个NSTimer并使用更新的计数器恢复第一个?

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

进一步的问题:如果上面写的内容证明是正确的viewcontroller,当从背景切换到前景或反之亦然时,如何管理获取timer_value(类似的标记secondsLeft)的实例?

Rob*_*ier 6

而不是试图NSTimer在后台维持一个(这不可能超过大约10分钟),你想要做的是记录你的计时器何时启动并保存NSUserDefaults.你仍然可以每秒更新你的计时器,但只是根据开始时间重新计算标签(记住,NSTimer不保证它会按时运行;它可能会因为很多原因而延迟,你会漂移).

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

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