【发布时间】:2017-05-20 01:56:11
【问题描述】:
我有这两个功能可以测量手机锁定或应用程序处于后台时的经过时间:
func saveTimeInBackground(){
startMeasureTime = Int(Date.timeIntervalSinceReferenceDate)
}
func timeOnAppActivated(){
stopMeasureTime = Int(Date.timeIntervalSinceReferenceDate)
elapsedTime = stopMeasureTime - startMeasureTime
seconds = seconds - elapsedTime + 2
if seconds > 0 {
timerLbl.text = "time: \(seconds)"
} else {
seconds = 0
timerLbl.text = "time: \(seconds)"
}
}
然后在 viewDidLoad() 我有观察者在应用程序变为活动/不活动时触发函数:
NotificationCenter.default.addObserver(self, selector: #selector(saveTimeInBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(timeOnAppActivated), name: Notification.Name.UIApplicationDidBecomeActive, object: nil)
问题是,当应用程序处于活动状态时,会有 2 秒(大约)的差异,所以我增加了 2 秒,它似乎工作正常,但前提是经过的时间 > 15 秒。 如果我锁定手机并立即将其解锁,则缺少 5 秒或更长时间。例如,如果还剩 50 秒,当我锁定并立即解锁时,还剩 42 秒。
谁能解释一下,我做错了什么?
编辑:应用的逻辑是这样的:
它在 2 名玩家之间开始一场比赛,每场 60 秒。问题是当其中一名玩家锁定手机时,应用程序会停止测量时间。这样如果player1还有10秒可以移动,player2还有50秒。我正在寻找一种可靠的方法来计算时间,即使玩家锁定手机或将应用置于后台。
编辑 2:我想我弄清楚了问题所在:我认为问题与“秒”是 Int 的事实有关,而 Date 不是以及何时转换它被四舍五入了。我没有测试它,但是当我找到解决方案时,我会发布答案。感谢大家的宝贵时间!
【问题讨论】:
-
不应该只是
seconds = elapsedTime + 2吗? -
seconds = 60, elapsed time = 10, seconds (on active) 60 - 10 (elapsed time),不只是 60 = 10
-
无论如何,它可以是 seconds -= elapsedTime 或 seconds -= stopMeasureTime - startMeasureTime 但为了清楚起见,我发现这样更好。
标签: swift