我认为您从错误的方向处理任务。
当用户输掉游戏时,您应该保存允许用户再次玩游戏的日期。而且因为您的用户可能会退出您的应用程序,所以您必须将该日期保留在某个地方(例如 NSUserDefaults)。
然后您启动一个计时器,该计时器每秒触发一次,以在用户无法玩游戏时向他显示倒计时。因此,您将保存的日期与现在进行比较(即NSDate())。如果“现在”较晚或与“下一个游戏日期”相同,则允许用户再次玩游戏。如果不是,则更新倒计时标签。
当用户启动应用程序时,您还必须检查用户是否被允许玩。为此,您必须获取持久日期并像以前一样进行比较。
这样的事情会起作用:
import UIKit
// NSDate extension so you can use ==, <= and so on
public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.compare(rhs) == .OrderedAscending
}
extension NSDate: Comparable { }
// NSDate extension end
class YourGame: NSObject {
var nextGameDate: NSDate?
var nextGameTimer: NSTimer?
func userDidLoseGame() {
// update UI so user cannot play new game ...
let calendar = NSCalendar.currentCalendar()
nextGameDate = calendar.dateByAddingUnit(.Minute, value: 20, toDate: NSDate(), options: [])!
// save date
NSUserDefaults.standardUserDefaults().setObject(nextGameDate!, forKey: "nextGameDate")
nextGameTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("refreshNextGameTime:"), userInfo: nil, repeats: true)
refreshNextGameTime(nextGameTimer!)
}
func refreshNextGameTime(timer: NSTimer) {
if let nextGameDate = nextGameDate where nextGameDate >= NSDate() {
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Full
formatter.allowedUnits = [.Minute, .Second]
let timeUntilNextGameString = formatter.stringFromDate(NSDate(), toDate: nextGameDate)
print("Can't play. Next game in \(timeUntilNextGameString)")
// show user time when he can play again ...
}
else {
timer.invalidate()
nextGameTimer = nil
print("Can play")
// update UI so user can play game ...
}
}
func userDidStartApp() {
// check if user is allowed to play game
if let savedNextGameDate = NSUserDefaults.standardUserDefaults().objectForKey("nextGameDate") as? NSDate where savedNextGameDate >= NSDate() {
// update UI so user cannot play new game ...
nextGameDate = savedNextGameDate
nextGameTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("refreshNextGameTime:"), userInfo: nil, repeats: true)
refreshNextGameTime(nextGameTimer!)
}
else {
// update UI so user can play game ...
}
}
}
这是一段代码,它可能包含像 NSCalendar 这样的新概念,但它应该非常简单。如果您不熟悉某些内容,请查看文档。