Swift 如何在视图/应用程序关闭后保持计时器运行?
我知道有很多问题与我有关,但我就是不知道在我的情况下该怎么办 这是一种“敞开胸膛”的游戏。它有一个计时器,一旦它达到零,用户可以继续到下一个ViewController(这是第三个ViewController,下一个是第四个ViewController) 我还有一个“后退”按钮,可以让你转到FirstViewController,在那里你可以继续做其他与游戏相关的事情,但是从那里你也可以来到这个SecondViewController来检查剩余的时间 但每次我这么做,计时器都会重置,我怎么才能让它继续运行呢?当用户去和其他游戏相关的东西?即使在应用程序关闭后,我如何保持其运行 剩余的秒数取决于从SecondViewController发送的变量 这是我到目前为止所做的Swift 如何在视图/应用程序关闭后保持计时器运行?,swift,background,Swift,Background,我知道有很多问题与我有关,但我就是不知道在我的情况下该怎么办 这是一种“敞开胸膛”的游戏。它有一个计时器,一旦它达到零,用户可以继续到下一个ViewController(这是第三个ViewController,下一个是第四个ViewController) 我还有一个“后退”按钮,可以让你转到FirstViewController,在那里你可以继续做其他与游戏相关的事情,但是从那里你也可以来到这个SecondViewController来检查剩余的时间 但每次我这么做,计时器都会重置,我怎么才
class StudioWaitingViewController: UIViewController {
var gameTimer = Timer()
var studioTime = StudioTime()
var secondsPassed : Double = 0
var timeNeededToRecord : Double = 0
var currentTime : Double = 0
var percentageOfBar = 0
var countdown = 0
override func viewDidLoad() {
super.viewDidLoad()
seeResultsButton.isHidden = true
firstArtistWaitBar.transform = firstArtistWaitBar.transform.scaledBy(x: 1, y: 20)
firstArtistWaitBar.progress = 0
firstArtistWaitHour.text = String(format:"%.f", "\(timeNeededToRecord)s")
gameTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateFirstArtist), userInfo: nil, repeats: true)
countdown = Int(timeNeededToRecord)
}
@objc func updateFirstArtist() {
// if todo
if secondsPassed < timeNeededToRecord {
currentTime = secondsPassed / timeNeededToRecord
secondsPassed += 1
percentageOfBar = Int(currentTime * 100)
firstArtistWaitPercentage.text = "\(percentageOfBar)%"
firstArtistWaitHour.text = "\(countdown)s"
countdown -= 1
print(countdown)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.firstArtistWaitBar.setProgress( Float(self.currentTime) , animated: false)
// 10-second animation changing from 100% to 0%
UIView.animate(withDuration: 1.5, delay: 0, options: [], animations: { [unowned self] in
self.firstArtistWaitBar.layoutIfNeeded()
}) }
} else if secondsPassed == timeNeededToRecord {
firstArtistWaitPercentage.text = "Done!"
firstArtistWaitBar.setProgress(1, animated: false)
gameTimer.invalidate()
firstArtistWaitHour.text = "Done!"
UIView.animate(withDuration: 1.5, delay: 0, options: [], animations: { [unowned self] in
self.firstArtistWaitBar.layoutIfNeeded()
})
seeResultsButton.isHidden = false
gameTimer.invalidate()
}
// if todo
}
类StudioWaitingViewController:UIViewController{
var gameTimer=Timer()
var studioTime=studioTime()
var secondsPassed:Double=0
var TimeneedToRecord:双精度=0
var currentTime:Double=0
var percentageOfBar=0
var倒计时=0
重写func viewDidLoad(){
super.viewDidLoad()
请参见resultsbutton.ishiden=true
firstArtistWaitBar.transform=firstArtistWaitBar.transform.scaledBy(x:1,y:20)
firstArtistWaitBar.progress=0
firstArtistWaitHour.text=字符串(格式:“%.f”,“\(TimeNeedToRecord)s”)
gameTimer=Timer.scheduledTimer(时间间隔:1,目标:self,选择器:#选择器(UpdateFirstart),用户信息:nil,重复:true)
倒计时=整数(需要记录的时间)
}
@objc func updateFirstArtist(){
//如果要做
如果使用秒间隔<记录所需时间{
currentTime=秒已通过/需要记录的时间
秒间隔+=1
百分比值bar=Int(当前时间*100)
firstArtistWaitPercentage.text=“\(百分百分百)
firstArtistWaitHour.text=“\(倒计时)s”
倒计时-=1
打印(倒计时)
DispatchQueue.main.asyncAfter(截止日期:.now()+0.1){
self.firstArtistWaitBar.setProgress(Float(self.currentTime),动画:false)
//10秒动画从100%更改为0%
动画(持续时间:1.5,延迟:0,选项:[],动画:{[unowned self]in
self.firstArtistWaitBar.layoutIfNeed()
}) }
}else如果secondsPassed==需要记录的时间{
firstArtistWaitPercentage.text=“完成!”
firstArtistWaitBar.setProgress(1,动画:false)
gameTimer.invalidate()的
firstArtistWaitHour.text=“完成!”
动画(持续时间:1.5,延迟:0,选项:[],动画:{[unowned self]in
self.firstArtistWaitBar.layoutIfNeed()
})
请参见ResultsButton.isHidden=false
gameTimer.invalidate()的
}
//如果要做
}
无论如何,我对编码还是很陌生,如果你认为我可以改进我的代码,请说要使计时器功能在后台运行,你可以在你的应用目标上的签名和功能的后台模式上标记
音频、播放和画中画
选项
现在,这仅在应用程序处于后台(未关闭)时有效,在应用程序关闭时无法执行任何任务。解决方法是存储应用程序上次打开的日期/时间,并进行适当的计算
可以澄清有关后台执行的更多信息。为此,请创建控制计时器的Singleton类