bom*_*dit 2 closures ios swift
在学习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()
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*sko 17
您需要在主线程上执行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()
}
Run Code Online (Sandbox Code Playgroud)
编辑
虽然这里不重要,因为不保留闭包,但在某些情况下,明确声明捕获列表以避免保留周期非常重要.
| 归档时间: |
|
| 查看次数: |
3639 次 |
| 最近记录: |