即使控制台立即显示输出,iOS UILabel视图更新也会有延迟

时间:2015-02-23 06:32:25

标签: iphone swift ios8 uilabel synchronous

我试图在我的视图中更新一对UILabel,但我在更新时遇到了延迟。我正在创建一个NSURLSession,我不知道这是什么导致了这个问题,但是我能够在没有任何代码的情况下更新其他UILabel。延迟。

当执行此代码时,我会立即看到两个第一个printlns及其值,还有第三个println,其中包含字符串" done"也立即在输出控制台中。然而,在模拟器中,activityIndi​​cator运行,然后大约15秒后更新UILabel并且activityIndi​​cator停止。它不是activityIndi​​cator的问题,因为即使我拿出那些代码,UILabels更新仍然存在延迟。而且我知道在更新UILabel之前它并没有真正等待返回数据,因为这些值显示在输出控制台中。

有关视图中更新/显示延迟原因的任何想法?而且为什么控制台输出似乎跳过更新并打印"完成"字符串,实际上它上面的代码行还没有完成?

    @IBOutlet var attribute1: UILabel!
    @IBOutlet var attribute2: UILabel!
    ...
    var url = NSURL(string: "http://www.example.com")
    if url != nil {
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: {
            (data, response, error) -> Void in
            var urlError = false
            if error == nil {
                var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as String!

                // we then parse out the relevant bits of data
                var urlContentArray = urlContent.componentsSeparatedByString("<header class=\"blah\")
                if urlContentArray.count > 0 {
                    var attributesArray = urlContentArray[1].componentsSeparatedByString("<span class=\"something\">")
                    var att1Array = attributesArray[1].componentsSeparatedByString("</span>")
                    var att2Array = attributesArray[2].componentsSeparatedByString("</span>")

                    println(att1Array[0])
                    println(att2Array[0])
                    self.attribute1.text = att1Array[0]
                    self.attribute2.text = att2Array[0]
                    println("done")
                    self.activityIndicator.stopAnimating()
                } else {
                    urlError = true
                }
            } else {
                urlError = true
            }
            if urlError == true {
                self.showURLError()
            }
        })
        task.resume()
        self.activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, screenSize.width, 930))
        self.activityIndicator.hidesWhenStopped = true
        self.activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.White
        self.view.addSubview(self.activityIndicator)
        self.activityIndicator.startAnimating()
    } else {
        showURLError()
    }

1 个答案:

答案 0 :(得分:1)

NSURLSession在后​​台线程上执行,但您应该始终更新主线程上的UI元素。

dispatch_async(dispatch_get_main_queue()) {
    self.attribute1.text = att1Array[0]
    self.attribute2.text = att2Array[0]
    self.activityIndicator.stopAnimating()            
}