簡體   English   中英

在 Swift 閉包內更新的 UILabel 文本拒絕顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM