gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:08:11 26 4
gpt4 key购买 nike

我正在制作一个依赖计时器的应用程序,该计时器每分钟触发一次,将标签从“还剩 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)
}

最佳答案

如 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()
}

请注意,当您离开此 View 时,您需要注销通知。在 viewWillDisappear 中执行此操作可能是个好地方。

关于ios - 当应用程序进入后台时保持计时器运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31867030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com