我在NSUserDefaults
内挥动时间值,当我重复使用ViewController
时,我的NSTimer
会为时区添加+1
这里是我的更新功能:
func fireUpdatedLimit() {
var endTimeSeconds = userDefaults.integerForKey("endTimeSeconds\(currentUserId!)")
if endTimeSeconds > 0 {
endTimeSeconds += 1
userDefaults.setInteger(endTimeSeconds, forKey: "endTimeSeconds\(currentUserId!)")
}
self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ViewController.updateLimit), userInfo: nil, repeats: true)
}
在这里我已经尝试过了:
weak var timer = NSTimer()
weak var timer: NSTimer?
self.timer = nil
self.timer.invalidate()
逻辑:
func updateLimit() {
var timeLeft = userDefaults.integerForKey("endTimeSeconds\(currentUserId!)")
foregroundAction() {
self.lockedTimeLabel.hidden = false
self.lockedImageView.hidden = false
}
self.lockedTimeLabel.text = String(fromTimeInterval: Double(timeLeft))
if timeLeft <= 0 {
print("ended")
foregroundAction() {
self.lockedImageView.hidden = true
self.lockedTimeLabel.hidden = true
self.mediaImageView.hidden = true
self.followerImageView.hidden = true
}
self.reloadContent()
userDefaults.setInteger(timeLeft, forKey: "endTimeSeconds\(currentUserId!)")
self.timer!.invalidate()
} else {
timeLeft -= 1
userDefaults.setInteger(timeLeft, forKey: "endTimeSeconds\(currentUserId!)")
}
}
答案 0 :(得分:1)
如果您将计时器设置为nil
,那么参考会被破坏而您无效,因此您必须先致电invalidate
。
确保在您创建新计时器时始终检查参考并使其无效,因为这也会破坏对旧计时器的任何引用。
此外,永远不要使用Timer()
创建虚拟/占位符计时器,您需要一个可选的引用(?
)。