如何根据Swift中的外部事件更新变量?

时间:2016-01-24 03:03:17

标签: ios swift sparkcore

我正在使用粒子核心来获取我房间的温度。通过云访问温度,云在变量中不断更新。这是我访问变量并显示它的方式:

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秒左右更新一次。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我假设我们看到的不是完整的代码。在viewDidLayoutSubviews函数中,您将调用updateTemp两次。一旦明确地通过计时器回调一次。

您的updateTemp函数会在主运行循环中调度网络调用,这也是计时器也在运行的地方。 dispatch_after函数一个接一个地将读出更新的执行排队。我现在假设,您的显示代码中的某些内容会导致viewDidLayoutSubviews的重复触发,每个触发器都会调度两个新的更新等。即使假设是假的(由于网络代码缓慢而且还有其他几种可能性在主运行循环中运行),我猜你是否放弃对updateTemp的显式调用,你将失去"指数"应该没问题。

一般情况下,由于Web调用很大程度上是异步的,您可以直接使用计时器并调用传感器,或者如果您认为GCD具有重要的性能优势,请切换到dispatch_async并通过调用应用每个调用的下一个可用队列dispatch_get_global_queue