Swift WatchKit上的计时器未每秒启动

Swift WatchKit上的计时器未每秒启动,swift,timer,watchkit,Swift,Timer,Watchkit,这个计时器不是每秒钟启动一次,当我检查日志和UI时,它似乎每3-4秒启动一次 func startTimer() { print("start timer") timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerDidFire),

这个计时器不是每秒钟启动一次,当我检查日志和UI时,它似乎每3-4秒启动一次

func startTimer() {
    print("start timer")
    timer = Timer.scheduledTimer(timeInterval: 1,
                                 target: self,
                                 selector: #selector(timerDidFire),
                                 userInfo: nil,
                                 repeats: true)
}

func timerDidFire(timer: Timer) {
    print("timer")
    updateLabels()
}
这仅仅是由于缺乏功能而将要发生的事情,还是我的代码中有错误

这是日志(如果需要)

0.0396000146865845
3.99404102563858
7.97501903772354
11.9065310359001
编辑:


为了澄清,我每秒更新的是训练计时器,因此它需要每秒钟更新一次。

如果你的应用程序正在忙于做其他事情,这会阻止或延迟跑步循环检查点火时间是否已重复通过,:

重复计时器总是根据计划的触发时间而不是实际触发时间来调度自身。例如,如果一个计时器计划在某个特定时间触发,并且在该时间之后每5秒触发一次,则计划的触发时间将始终落在原来的5秒时间间隔上,即使实际触发时间延迟如果点火时间延迟到超过一个或多个预定点火时间,则该计时器在该时间段内仅点火一次定时器在触发后会重新安排,以便在将来的下一个预定触发时间

另外,根据对更改的响应(例如,观察)或对事件的响应(例如,完成处理程序)更新UI可能更有效

  • 这避免了在驱动应用程序进行检查但实际上没有要执行的UI更新(如果在计时器间隔期间没有任何更改)时,为应用程序创建繁忙的工作

  • 它还可以防止在触发间隔内忽略多个更改,因为计时器驱动的模式将只显示UI中的最后一个更改


考虑使用WKInterfaceTimer标签代替用于显示计时的标签:

WKInterfaceTimer对象是一种特殊类型的标签,用于显示 倒计时或倒计时。使用计时器对象来配置 时间量和计时器文本的外观。当你开始 计时器WatchKit会自动更新屏幕上显示的文本 用户的Apple Watch,无需扩展进一步交互。

WatchOS将负责保持此更新。操作系统为您处理标签,但您必须跟踪所经过的时间:您只需要设置一个NSDate即可(参见下面的示例)

示例代码。

在WKInterfaceController子类中:

// Hook up a reference to the timer. @IBOutlet var workoutTimer: WKInterfaceTimer! // Keep track of the time the workout started. var workoutStartTime: NSDate? func startWorkout() { // To count up use 0.0 or less, otherwise the timer counts down. workoutTimer.setDate(NSDate(timeIntervalSinceNow: 0.0)) workoutTimer.start() self.workoutStartTime = NSDate() } func stopWorkout() { workoutTimer.stop() } func workoutSecondsElapsed() -> NSTimeInterval? { // If the timer hasn't been started then return nil guard let startTime = self.workoutStartTime else { return nil } // Time intervals from past dates are negative, so // multiply by -1 to get the elapsed time. return -1.0 * self.startTime.timeIntervalSinceNow } //连接对计时器的引用。 @IBOutlet var workoutTimer:WKInterfaceTimer! //记录训练开始的时间。 var工作开始时间:NSDate? func startWorkout(){ //要向上计数,请使用0.0或更小,否则计时器将向下计数。 workoutTimer.setDate(NSDate(timeIntervalSinceNow:0.0)) workoutTimer.start() self.workoutStartTime=NSDate() } func stopWorkout(){ workoutTimer.stop() } func workoutSecondsElapsed()->NSTimeInterval?{ //如果计时器尚未启动,则返回nil 守卫让startTime=self.workoutStartTime-else{ 归零 } //过去日期的时间间隔为负值,因此 //乘以-1得到经过的时间。 return-1.0*self.startTime.timeintervalcessincenow }
全面的博客条目:。

你确定“计时器”的日志不是每秒钟打印一次,用户界面也不是最新的吗?@pbush25是的,它肯定是每4秒运行一次的日志。我在上面贴了日志以了解详情。有什么想法吗?计时器正在主线程上运行?谢谢您的回复!我认为这是有道理的。但我想我唯一的问题是,我只是在更新显示训练所用时间的标签的用户界面,因此需要每秒钟更新一次,我使用的方法与WWDC 2016视频和文档中显示的方法相同。你知道我的意思吗?啊。你应该编辑你的问题,并描述你具体想做什么。基于,我认为你在更新卡路里。啊,明白了。我编辑了这个问题来描述更多细节,谢谢。你有什么想法吗?现在你有了我正在更新的细节,这不是WKInterfaceTimer的用途吗?哪个WWDC视频?