Swift 如何在视图/应用程序关闭后保持计时器运行?

Swift 如何在视图/应用程序关闭后保持计时器运行?,swift,background,Swift,Background,我知道有很多问题与我有关,但我就是不知道在我的情况下该怎么办 这是一种“敞开胸膛”的游戏。它有一个计时器,一旦它达到零,用户可以继续到下一个ViewController(这是第三个ViewController,下一个是第四个ViewController) 我还有一个“后退”按钮,可以让你转到FirstViewController,在那里你可以继续做其他与游戏相关的事情,但是从那里你也可以来到这个SecondViewController来检查剩余的时间 但每次我这么做,计时器都会重置,我怎么才

我知道有很多问题与我有关,但我就是不知道在我的情况下该怎么办

这是一种“敞开胸膛”的游戏。它有一个计时器,一旦它达到零,用户可以继续到下一个ViewController(这是第三个ViewController,下一个是第四个ViewController)

我还有一个“后退”按钮,可以让你转到FirstViewController,在那里你可以继续做其他与游戏相关的事情,但是从那里你也可以来到这个SecondViewController来检查剩余的时间

但每次我这么做,计时器都会重置,我怎么才能让它继续运行呢?当用户去和其他游戏相关的东西?即使在应用程序关闭后,我如何保持其运行

剩余的秒数取决于从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类