2014-10-08 62 views
2

在学习Swift时,我编写了一个简单的iOS实践应用程序,用于从网站中为给定城市提供天气信息并在UILabel中显示它。在Swift封闭内更新的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() 

} 

回答

17

您需要在主线程

NSURLSession完成处理程序总是会在后台线程调用执行您的UI更新。要更新您的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() 
} 

编辑

虽然这里并不重要,因为关闭不被保留,在某些情况下,对explicitly declare capture lists to avoid retain cycles重要。

+0

您的意思是应该只在机箱外更新UILabel吗?我如何保留封闭之外的文本? – bombaypundit 2014-10-08 17:05:15

+0

我更新了我的答案:)关闭会捕获您通过的任何值 – 2014-10-08 17:10:59

+0

谢谢,这很好地工作。你是一个拯救生命的人:)。 – bombaypundit 2014-10-08 17:21:42