我的倒数计时器有一个奇怪的问题。当我按下“开始”按钮时,它会正常启动;当我关闭应用程序并重新启动时,它会重新正确设置。但是,当我选择其他标签并停留一段时间后,它将停止递减计数,然后在再次显示倒数标签时从中断的位置开始递减计数。
例如,如果计时器现在位于00:28:00
(格式为HH:MM:SS),则选择其他标签,在该标签上停留5分钟,然后返回到计时器标签,它仅位于27:52
标记处。当我关闭应用程序(双击主屏幕按钮,向上滑动我的应用程序)并重新打开它时,它以更合理的22:50
标记开始。
我已经从该类中发布了相关代码,以显示我如何设置计时器,但是它的功能概述如下:
recalculate()
。 recalculate()
触发CalculateOperation
。 CalculateOperation
根据新记录的添加/删除来计算起始HH:MM:ss。 successBlock
的CalculateOperation
在主线程中执行。 CalculateOperation
,则NSTimer
在successBlock
中创建countdownTimer
。 NSTimer
每1秒执行一次decayCalculation()
。通过调用calculation.timer
将tick()
减少1秒。 码:
class CalculatorViewController: MQLoadableViewController {
let calculationQueue: NSOperationQueue // Initialized in init()
var calculation: Calculation?
var countdownTimer: NSTimer?
func recalculate() {
if let profile = AppState.sharedState.currentProfile {
// Cancel all calculation operations.
self.calculationQueue.cancelAllOperations()
let calculateOperation = self.createCalculateOperation(profile)
self.calculationQueue.addOperation(calculateOperation)
}
}
func decayCalculation() {
if let calculation = self.calculation {
// tick() subtracts 1 second from the timer and adjusts the
// hours and minutes accordingly. Returns true when the timer
// goes down to 00:00:00.
let timerFinished = calculation.timer.tick()
// Pass the calculation object to update the timer label
// and other things.
if let mainView = self.primaryView as? CalculatorView {
mainView.calculation = calculation
}
// Invalidate the timer when it hits 00:00:00.
if timerFinished == true {
if let countdownTimer = self.countdownTimer {
countdownTimer.invalidate()
}
}
}
}
func createCalculateOperation(profile: Profile) -> CalculateOperation {
let calculateOperation = CalculateOperation(profile: profile)
calculateOperation.successBlock = {[unowned self] result in
if let calculation = result as? Calculation {
self.calculation = calculation
/* Hide the loading screen, show the calculation results, etc. */
// Create the NSTimer.
if self.countdownTimer == nil {
self.countdownTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("decayCalculation"), userInfo: nil, repeats: true)
}
}
}
return calculateOperation
}
}
最佳答案
好吧,如果我将应用程序留在其他选项卡中并且一段时间不触摸手机,则它最终进入睡眠状态,该应用程序退出 Activity 状态,并进入后台,从而停止了计时器。
解决方案是将我的视图控制器设置为UIApplicationWillEnterForegroundNotification
的侦听器,并调用recalculate
来更正计时器的倒计时值。