我正在使用粒子核心来获取我房间的温度。通过云访问温度,云在变量中不断更新。这是我访问变量并显示它的方式:
func updateTemp(){
let seconds = 3.0
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
self.myPhoton?.getVariable("tempF", completion: { (result:AnyObject!, error:NSError!) -> Void in
if let _ = error {
print("Failed reading temperature from device")
}
else {
if let larry = result as? Int {
self.temp.text="\(larry)˚"
self.truth++ //Once a value has been found, update the count.
}
}
})
})
}
override func viewDidLoad() {
sparkStart()
}
override func viewDidLayoutSubviews() {
updateTemp()
NSTimer.scheduledTimerWithTimeInterval(100.0, target: self, selector: "updateTemp", userInfo: nil, repeats: true) //Gaurantees that the app is updated every 100 seconds. That way we have a fresh temperature often.
//Stop the spinning once a value has been found
if truth == 1{
activity.stopAnimating()
activity.removeFromSuperview()
}
}
由于这是我的粒子核心检测环境温度,温度变量不断变化。但是,当我使用NSTimer时,代码不会在指定的时间内更新。相反,它首先根据指定的时间进行更新,但随后时间开始呈指数下降,变量每0.001秒左右更新一次。有什么想法吗?
答案 0 :(得分:0)
我假设我们看到的不是完整的代码。在viewDidLayoutSubviews函数中,您将调用updateTemp两次。一旦明确地通过计时器回调一次。
您的updateTemp函数会在主运行循环中调度网络调用,这也是计时器也在运行的地方。 dispatch_after函数一个接一个地将读出更新的执行排队。我现在假设,您的显示代码中的某些内容会导致viewDidLayoutSubviews的重复触发,每个触发器都会调度两个新的更新等。即使假设是假的(由于网络代码缓慢而且还有其他几种可能性在主运行循环中运行),我猜你是否放弃对updateTemp的显式调用,你将失去"指数"应该没问题。
一般情况下,由于Web调用很大程度上是异步的,您可以直接使用计时器并调用传感器,或者如果您认为GCD具有重要的性能优势,请切换到dispatch_async并通过调用应用每个调用的下一个可用队列dispatch_get_global_queue