swift 3:观看应用程序:如果手表进入睡眠状态,接口控制器之间会出现延迟

时间:2017-08-03 19:08:26

标签: swift xcode apple-watch watch watch-os-2

我有一个倒数计时器接口控制器,一旦计时器下降到00:00,就会启动另一个接口控制器。如果我将计时器保持活动状态直到计时器到达00:00,那么第二个接口控制器将按预期启动。但是,如果手表进入睡眠状态,即使它在计时器到达00:00之前处于活动状态,在第二个接口控制器启动之前,将会有几秒钟的延迟超过一分钟。

当我在手表模拟器中运行时,当我在实际设备上运行时,不会出现此缺陷。

我正在使用Xcode 8和swift 3。

这是来自第一个接口控制器的代码:

// this func will update the countdown timer
@objc private func updateTimer() {
    totalNumberOfSeconds += 1
    numberOfSeconds += 1
    if (numberOfSeconds == numSecondsInMinute) {
        numberOfSeconds = 0
    }

    // only attempt to open the RacingTimer interface if this IC is visible
    if (isStillVisible) {
        // change to the Racing Timer if the countdown timer hits 00:00
        if (totalNumberOfSeconds > originalSecondsTimeInterval) {
            // the watch must have gone to sleep when the countdown timer
            // hit 00:00, so the total num secs is past the orig timer
            // set the numberOfSeconds to total - original to pass to RacingTimer
            numberOfSeconds = totalNumberOfSeconds - originalSecondsTimeInterval

            // launch the racing timer
            WKInterfaceController.reloadRootControllers(withNames: ["RacingTimer"], contexts: [numberOfSeconds])

            // destroy the timer and reset the vars
            countdownClock.invalidate()
            numberOfSeconds = 0
            totalNumberOfSeconds = 0
        } else if (totalNumberOfSeconds == originalSecondsTimeInterval) {
            // launch the racing timer
            WKInterfaceController.reloadRootControllers(withNames: ["RacingTimer"], contexts: nil)

            // destroy the timer and reset the vars
            countdownClock.invalidate()
            numberOfSeconds = 0
            totalNumberOfSeconds = 0
        }
    }
}


override func awake(withContext context: Any?) {
    super.awake(withContext: context)

    // get race and timer data
    let numSecs = raceDS.timer * 60
    originalSecondsTimeInterval = numSecs
    cdt = NSDate(timeIntervalSinceNow: TimeInterval(numSecs))
    countdownTimer.setDate(cdt as Date)
    countdownClock = Timer.scheduledTimer(timeInterval: 1, target: self,   selector: #selector(updateTimer), userInfo: nil, repeats: true)
    countdownTimer.start()
}


override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
    nearestMinuteButtonOutlet.setTitle("will activate") // debug only
    didAppear()
}


// set the visible boolean to true
override func didAppear() {
    super.didAppear()
    isStillVisible = true
    nearestMinuteButtonOutlet.setTitle("did appear")  // debug only
}


// set the boolean to false
override func didDeactivate() {
    // This method is called when watch view controller is no longer visible
    super.didDeactivate()
    isStillVisible = false
    nearestMinuteButtonOutlet.setTitle("sleeping")  // debug only
}

如果手表进入睡眠状态,我真的不知道为什么会有延迟。任何帮助将不胜感激。 TIA。

1 个答案:

答案 0 :(得分:0)

watchOS3开始,没有办法在后台运行TimerTimer对象不应用于iOS的精确时间测量。在iOS,您可以选择使用CADisplayLink来获得准确的时间安排,但watchOS3/4无法使用此功能。

要在后台测量时间,您应该在应用程序进入后台之前保存当前日期,并计算再次启动应用程序所用的时间。

如果您只是需要在用户打开您的应用时显示其他InterfaceController,您可以使用使用日期描述的方法,并且您可以尽快导航到其他InterfaceController用户再次打开您的应用。

如果在倒计时结束时需要执行某些代码,则应该安排后台任务,它们是目前watchOS在后​​台运行代码的唯一方法。