关闭并打开游戏后,让NSTimer继续

时间:2015-07-05 18:32:46

标签: ios swift nsuserdefaults nstimer

我正在制作一个点击游戏,我需要在关闭应用程序后让我的NSTimers继续。我先看了这个,但我找不到合适的Swift答案。我想我可以使用UserDefaults,但我不知道如何应用它。很抱歉,如果这是一个重复的问题,我知道有很多相关信息。

var timerVar = NSTimer.scheduledTimerWithTimeInterval(4, target: self,     
selector: Selector("selectorName"), userInfo: nil, repeats: true)

func selectorName(){
    var ScoreDefault = NSUserDefaults.standardUserDefaults()
    ScoreDefault.setValue(Score, forKey: "Score")
    ScoreDefault.synchronize()
    Score+=1
    scoreLbl.text = "\(Score)"
}

3 个答案:

答案 0 :(得分:0)

您无法暂停和继续计时器。您必须使其无效,然后创建一个新的。记录启动计时器时的时间,然后暂停时,计算经过的时间并使用它来计算剩余时间。使用您计算的剩余时间量创建一个新计时器。

答案 1 :(得分:0)

  

这并没有解决所要求的内容,但也许对其他人有用。

iOS应用无法在后台任意运行,如Background Execution in Apple’s App Programming Guide for iOS中所述。使用电池非常低效,每4秒唤醒一次你的应用程序以增加一个计数器;想象一下,如果每个应用程序都这样做,并且安装了数请参阅Minimize Timer Use in Apple’s Energy Efficiency Guide for iOS Apps

相反,存储您上次更新分数的时间,然后当您的应用再次运行时,它可以计算从现在起的差异并相应地更新分数。我会说即使应用程序位于前台,计算分数也是一个更好的设计。

您可以使用CFAbsoluteTimeGetCurrent功能或NSDate()获取当前时间。

代码风格:这与问题无关,但如果我决定编写该方法,我会做一些不同的事情:

func incrementScore() {
    score += 1
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setValue(score, forKey: "Score")
    scoreLabel.text = "\(score)"
}
  • 将方法命名为有意义的方法。
  • 使用let代替var作为标准用户默认参考,因为它不会更改。
  • 不是ScoreDefaults。这是共享的标准用户默认对象,不是特定于分数。
  • 变量和属性名称以小写字母开头更为常见。
  • 通常不需要同步用户默认值。

答案 2 :(得分:0)

好的我明白了。然而,它并不漂亮但有效我会发布代码,也许有人可以清理它或使用不同的方法。我最终创建了另一个名为scoreIncrementor的变量,然后在didMoveToView中创建了一个NSTimer,每秒运行一次简单的score = score + scoreincrementor。以下是任何人都需要它的代码随时编辑你心中的喜悦。为此,我还制作了另一个标签,以查看正在添加的内容" tempScoreLbl"。

 var ScoreIncrementor = Double()
 var Score = Double()
 var scoreLbl: UILabel!
 var tempscoreLbl: UILabel!

override func didMoveToView(view: SKView) {

var ScoreDefault = NSUserDefaults.standardUserDefaults()

    if (ScoreDefault.valueForKey("Score") != nil){
        Score = ScoreDefault.valueForKey("Score") as! Double
    }
    ScoreDefault.setValue(Score, forKey: "Score")
    ScoreDefault.synchronize()

var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults()

    if (ScoreIncrementorDefault.valueForKey("ScoreIncrementor") != nil){
         ScoreIncrementor = ScoreIncrementorDefault.valueForKey("ScoreIncrementor") as! Double
    }

    ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor")
    ScoreIncrementorDefault.synchronize()

    let scorePerSecond = NSTimer.scheduledTimerWithTimeInterval(1 , target: self, selector: Selector("permanentIncrementor"),userInfo: nil, repeats: true)

self.view?.addSubview(scoreLbl)
self.view?.addSubview(tempscoreLbl)
}


func permanentIncrementor(){
    Score = Score + ScoreIncrementor
    var ScoreDefault = NSUserDefaults.standardUserDefaults()
    ScoreDefault.setValue(Score, forKey: "Score")
    ScoreDefault.synchronize()
    scoreLbl.text = "\(Score)"

}

func gloveUpgrade(){
    if Score >= 50{

        let scorePerSecond = NSTimer.scheduledTimerWithTimeInterval(0 , target: self, selector: Selector("gloveUpgradeTimer"),userInfo: nil, repeats: false)
        var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults()
        ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor")
        ScoreIncrementorDefault.synchronize()
        Score-=50

        tempscoreLbl.text = "\(ScoreIncrementor)"

    }
}
func gloveUpgradeTimer(){
    //increase score per minute by .25
    var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults()
    ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor")
    ScoreIncrementorDefault.synchronize()

    ScoreIncrementor+=0.25
    tempscoreLbl.text = "\(ScoreIncrementor)"
}