NSTimer不在WatchOS2中进行调度

时间:2015-08-23 15:26:12

标签: swift nstimer watch-os-2

我想要获得一个心脏跳动的动画,以匹配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)
}

3 个答案:

答案 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)
            })
        })
}

这看起来是对的吗?它具有所需的效果,除了在采集新样品时粘住。