让 NSTimer 在关闭和打开游戏后继续
Make NSTimer continue after closing and opening the game
我正在制作唱首歌游戏,我需要让我的 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)"
}
您不能暂停和继续计时器。您必须使其无效,然后创建一个新的。记录你启动计时器的那一刻的时间,然后当你暂停它时,计算出经过的时间,并用它来计算剩余的时间。使用您计算的剩余时间创建一个新计时器。
This doesn’t address what the asked wanted, but maybe it will be useful for someone else.
iOS 应用不能运行 任意在后台运行,如Background Execution in Apple’s App Programming Guide for iOS. It would be really inefficient use of the battery to wake your app up every 4 seconds to increment a counter; imagine if every app did this and there were hundreds installed. See Minimize Timer Use in Apple’s Energy Efficiency Guide for iOS Apps.
所述
相反,存储您上次更新分数的时间,然后当您的应用再次 运行ning 时,它可以计算与现在的差异并相应地更新分数。我想说计算分数是一个更好的设计,即使应用程序在前台也是如此。
您可以从 CFAbsoluteTimeGetCurrent
function, or by using NSDate()
.
中获取当前时间
代码风格:这与问题无关,但如果我决定编写该方法,我会做一些不同的事情:
func incrementScore() {
score += 1
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(score, forKey: "Score")
scoreLabel.text = "\(score)"
}
- 给方法起一个有意义的名字。
- 使用
let
而不是 var
作为标准用户默认值参考,因为它不会更改。
- 不是
ScoreDefaults
。这是共享的标准用户默认对象,不特定于分数。
- 变量和 属性 名称以小写字母开头更为常见。
- 通常不需要同步用户默认值。
好的,我明白了。然而它并不漂亮但有效我会 post 代码也许有人可以清理它或使用不同的方法。我最终制作了另一个名为 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)"
}
我正在制作唱首歌游戏,我需要让我的 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)"
}
您不能暂停和继续计时器。您必须使其无效,然后创建一个新的。记录你启动计时器的那一刻的时间,然后当你暂停它时,计算出经过的时间,并用它来计算剩余的时间。使用您计算的剩余时间创建一个新计时器。
This doesn’t address what the asked wanted, but maybe it will be useful for someone else.
iOS 应用不能运行 任意在后台运行,如Background Execution in Apple’s App Programming Guide for iOS. It would be really inefficient use of the battery to wake your app up every 4 seconds to increment a counter; imagine if every app did this and there were hundreds installed. See Minimize Timer Use in Apple’s Energy Efficiency Guide for iOS Apps.
所述相反,存储您上次更新分数的时间,然后当您的应用再次 运行ning 时,它可以计算与现在的差异并相应地更新分数。我想说计算分数是一个更好的设计,即使应用程序在前台也是如此。
您可以从 CFAbsoluteTimeGetCurrent
function, or by using NSDate()
.
代码风格:这与问题无关,但如果我决定编写该方法,我会做一些不同的事情:
func incrementScore() {
score += 1
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(score, forKey: "Score")
scoreLabel.text = "\(score)"
}
- 给方法起一个有意义的名字。
- 使用
let
而不是var
作为标准用户默认值参考,因为它不会更改。 - 不是
ScoreDefaults
。这是共享的标准用户默认对象,不特定于分数。 - 变量和 属性 名称以小写字母开头更为常见。
- 通常不需要同步用户默认值。
好的,我明白了。然而它并不漂亮但有效我会 post 代码也许有人可以清理它或使用不同的方法。我最终制作了另一个名为 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)"
}