[英]UILabel text updated inside a Swift closure refuses to show
在學習 Swift 的同時,我正在編寫一個簡單的 iOS 應用程序,用於從站點中抓取給定城市的天氣信息並將其顯示在 UILabel 中。
該代碼使用“NSURLSession.sharedSession().dataTaskWithURL”閉包。 雖然我能夠正確獲取數據並捕獲“UILabel.text”中的相關文本,但我無法讓實際應用程序顯示更新的 UILabel。
我究竟做錯了什么? 這是相關的代碼:
@IBAction func buttonPressed(sender: AnyObject) {
var urlString = "http://www.weather-forecast.com/locations/" + cityName.text.stringByReplacingOccurrencesOfString(" ", withString: "") + "/forecasts/latest"
var url = NSURL(string: urlString)
let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in
var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as String
var contentArray = urlContent.componentsSeparatedByString("<span class=\"phrase\">")
var weatherInfo = contentArray[1].componentsSeparatedByString("</span>")
self.resultShow.text = weatherInfo[0] // Text does not show in the app
println(weatherInfo[0]) // This works correctly
println(self.resultShow.text) // This works correctly
}
task.resume()
}
您需要在主線程上執行 UI 更新
NSURLSession
完成處理程序將始終在后台線程上調用。 要更新你的 UI 一個簡單的dispatch_async
到主線程就足夠了:)
@IBAction func buttonPressed(sender: AnyObject) {
var urlString = "http://www.weather-forecast.com/locations/" + cityName.text.stringByReplacingOccurrencesOfString(" ", withString: "") + "/forecasts/latest"
var url = NSURL(string: urlString)
let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in
var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as String
var contentArray = urlContent.componentsSeparatedByString("<span class=\"phrase\">")
var weatherInfo = contentArray[1].componentsSeparatedByString("</span>")
dispatch_async(dispatch_get_main_queue(), {
//perform all UI stuff here
self.resultShow.text = weatherInfo[0]
})
}
task.resume()
}
編輯
雖然這里不重要,因為不保留閉包,但在某些情況下, 顯式聲明捕獲列表以避免保留循環很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.