我有一个倒数计时器接口控制器,一旦计时器下降到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。
答案 0 :(得分:0)
从watchOS3
开始,没有办法在后台运行Timer
。 Timer
对象不应用于iOS
的精确时间测量。在iOS
,您可以选择使用CADisplayLink
来获得准确的时间安排,但watchOS3/4
无法使用此功能。
要在后台测量时间,您应该在应用程序进入后台之前保存当前日期,并计算再次启动应用程序所用的时间。
如果您只是需要在用户打开您的应用时显示其他InterfaceController
,您可以使用使用日期描述的方法,并且您可以尽快导航到其他InterfaceController
用户再次打开您的应用。
如果在倒计时结束时需要执行某些代码,则应该安排后台任务,它们是目前watchOS
在后台运行代码的唯一方法。