在学习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完成处理程序将始终在后台线程上调用。要更新您的用户界面,只需在主线程中添加一个简单的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而言很重要。

关于ios - 在Swift闭包内更新的UILabel文本拒绝显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26262398/

10-14 20:00
查看更多