我的倒数计时器有一个奇怪的问题。当我按下“开始”按钮时,它会正常启动;当我关闭应用程序并重新启动时,它会重新正确设置。但是,当我选择其他标签并停留一段时间后,它将停止递减计数,然后在再次显示倒数标签时从中断的位置开始递减计数。

例如,如果计时器现在位于00:28:00(格式为HH:MM:SS),则选择其他标签,在该标签上停留5分钟,然后返回到计时器标签,它仅位于27:52标记处。当我关闭应用程序(双击主屏幕按钮,向上滑动我的应用程序)并重新打开它时,它以更合理的22:50标记开始。

我已经从该类中发布了相关代码,以显示我如何设置计时器,但是它的功能概述如下:

  • 我在某个地方有加号(+)和减号(-)按钮,点击该按钮时,请调用recalculate()
  • recalculate()触发CalculateOperation
  • CalculateOperation根据新记录的添加/删除来计算起始HH:MM:ss。 successBlockCalculateOperation在主线程中执行。
  • 如果尚未创建CalculateOperation,则NSTimersuccessBlock中创建countdownTimer
  • NSTimer每1秒执行一次decayCalculation()。通过调用calculation.timertick()减少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来更正计时器的倒计时值。

    10-08 05:34