当应用程序进入后台时,保持计时器运行

时间:2015-08-06 22:48:41

标签: ios swift

我正在创建一个应用程序,它依赖于每分钟触发一次的计时器,将标签从“x分钟左”更改为“(x-1)分钟左右。基本上,它每分钟减少一次。我需要计时器即使我关闭应用程序(不完全,只需按下主屏幕并让它在后台运行)即可运行,这样当用户在将其留在后台5分钟后回到应用程序时,标签会说“(x-5)分钟”。

现在,当我在模拟器中运行它时效果很好,但是当我在手机上运行它时它不起作用。如果我在手机上打开应用程序,它可以正常工作,但如果应用程序在后台运行,则标签永不减少。这可能是由于模拟器和实际iPhone处理多任务的方式不同吗?如果是这样,我如何更改我的代码,以便计时器仍然每分钟更新标签,以便在用户重新打开应用程序时显示正确的数字?

这是我的计时器设置:

var individualTaskTimer = NSTimer()

func createTimerForTopTask(){
    individualTaskTimer = NSTimer.scheduledTimerWithTimeInterval(tasks[0].minutes * 60, target: self, selector: "deleteTopTask", userInfo: nil, repeats: true)
}

2 个答案:

答案 0 :(得分:3)

如Ewan Mellor的回答所述,当应用程序在后台时,您将无法依赖计时器。因此,当您的应用返回到前台时,您需要根据需要进行调整。

首次阅读文档时,似乎viewWillAppearviewWillDisappear(或viewDidDisappear)是处理此问题的正确位置。但是,当应用程序移入/移出后台时,它们不会被调用。

相反,您可以使用两个通知UIApplicationWillResignActiveNotificationUIApplicationDidBecomeActiveNotification。第一个通知将在即将进入后台时发送到您的应用。当第二个通知即将返回到前台时,它将发送到您的应用程序。

因此,在viewWillAppear中,您可以按如下方式注册通知:

override func viewWillAppear(animated: Bool) {
   // some other code 
   NSNotificationCenter.defaultCenter().addObserver(self, selector: "activeAgain", name: "UIApplicationDidBecomeActiveNotification", object: nil)
   NSNotificationCenter.defaultCenter().addObserver(self, selector: "goingAway", name: "UIApplicationWillResignActiveNotification", object: nil)

}

其中activeAgaingoingAway是您编写的两个函数,用于启用和禁用计时器。因此,根据您问题中的代码段,它们看起来像这样:

func activeAgain() {
  let newTime = // calculate how much time is left (in seconds)
  individualTaskTimer = NSTimer.scheduledTimerWithTimeInterval(newTime, target: self, selector: "deleteTopTask", userInfo: nil, repeats: true)

}

func goingAway() {
  individualTaskTimer.invalidate()
}

请注意,当您从此视图切换时,需要取消注册通知。在viewWillDisappear中执行此操作可能是个好地方。

答案 1 :(得分:2)

你不能这样做。 iOS会在进入后台后暂停您的应用。只需在应用程序返回前台时使用正确的时间更新您的标签。