Search code examples
iosswiftnsuserdefaultsnstimer

Make NSTimer continue after closing and opening the game


I am making a clicker game and I need to have my NSTimers continue after closing the application. I looked this up first but I could not find a suitable answer for Swift. I think I can use UserDefaults but I am not sure how to apply it. Sorry if this is a duplicate question, I know there is a lot of information on this.

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)"
}

Solution

  • Ok I figured it out. However it is not pretty but effective i'll post the code maybe someone can clean it up or use a different method. I ended up making another variable called scoreIncrementor then made a NSTimer in the didMoveToView that ran every second doing a simple equasion of score = score + scoreincrementor. Here is the code should anyone need it feel free to edit to your hearts delight. For this I also made another label just to see what is being added "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)"
    }