我试图在我的视图中更新一对UILabel,但我在更新时遇到了延迟。我正在创建一个NSURLSession,我不知道这是什么导致了这个问题,但是我能够在没有任何代码的情况下更新其他UILabel。延迟。
当执行此代码时,我会立即看到两个第一个printlns及其值,还有第三个println,其中包含字符串" done"也立即在输出控制台中。然而,在模拟器中,activityIndicator运行,然后大约15秒后更新UILabel并且activityIndicator停止。它不是activityIndicator的问题,因为即使我拿出那些代码,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()
}
答案 0 :(得分:1)
NSURLSession
在后台线程上执行,但您应该始终更新主线程上的UI元素。
dispatch_async(dispatch_get_main_queue()) {
self.attribute1.text = att1Array[0]
self.attribute2.text = att2Array[0]
self.activityIndicator.stopAnimating()
}