我想要获得一个心脏跳动的动画,以匹配WatchOS2中心率采样形式的HealthKit。我似乎找不到根据最近的样本更新计时器间隔的方法。
经过一些研究,推荐的方法是使计时器失效并重新安排。但是下面的代码似乎没有完成任务。
class InterfaceController: WKInterfaceController {
var timer: NSTimer?
private func updateHeartRate(rate: Int) {
...
heartBeatIntensity = NSTimeInterval(0.0166 * Float(rate))
print(heartBeatIntensity)
if let timer = timer {
timer.invalidate()
}
timer = NSTimer.scheduledTimerWithTimeInterval(heartBeatIntensity, target:self, selector: Selector("updatesByTimer"), userInfo: nil, repeats: true)
}
答案 0 :(得分:3)
根据watchOS 2.0文档,从后台线程调用HKAnchoredObjectQuery的updateHandler。
查询在后台队列上执行此更新处理程序。
试试这个。
private func updateHeartRate(rate: Int) {
...
dispatch_async(dispatch_get_main_queue()) {
//your code
}
}
答案 1 :(得分:2)
这对我有用。我正在定义一个变量
<f:converter>
当我想要开始时:
<composite:insertChildren>
然后我使它无效
NSTimer *timer;
您是否曾尝试在启动计时器时调度到主队列?
答案 2 :(得分:0)
嗯,就是这样,但它非常不稳定。
调度计时器,
dispatch_async(dispatch_get_main_queue()){
self.heartBeatIntensity = NSTimeInterval(60 / Float(rate))
if let timer = self.timer {
timer.invalidate()
}
self.timer = NSTimer.scheduledTimerWithTimeInterval(self.heartBeatIntensity, target:self, selector: Selector("updatesByTimer"), userInfo: nil, repeats: true)
}
然后,我必须为WOGInterfaceController添加一个扩展,以便animateWithDuration添加一个完成块(SO post where I found the code)。之后,我最终得到了这个,
func updatesByTimer(){
WKInterfaceDevice.currentDevice().playHaptic(.Click)
animateWithDuration(heartBeatIntensity/2,
animations:
{
self.beatingHeart.setHeight(55.0)
self.beatingHeart.setWidth(55.0)
},
completion: {
self.animateWithDuration(self.heartBeatIntensity/2, animations: {
self.beatingHeart.setHeight(85.0)
self.beatingHeart.setWidth(85.0)
})
})
}
这看起来是对的吗?它具有所需的效果,除了在采集新样品时粘住。