2016-12-14 74 views
1

這是我的場景。我從openweather的json api開始,然後用一些屬性創建一個Weather類。在Weather實體內部,我創建了一個名爲downloadWeather的函數來實際解析api,然後我允許解析值保存在屬性中。例如,self.max_temp = valueParsedFromJSON。然後在MainViewController的ViewDidload內部,我創建一個天氣實例,它是天氣,調用函數downloadWeather,然後更新與weather.somproperty對應的ui標籤。下載到控制檯中的內容(僅用於調試)沒有問題,但它不會將內容呈現到UI中。是什麼原因?這是我的實際代碼:來自JSON的內容實際上並未呈現到UI中

var currentWeather:CurrentWeather! 
    // in MainViewControler.swift 
    // create weather instance to call downloadWeatherDetails function 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.delegate = self 
     tableView.dataSource = self 

     currentWeather = CurrentWeather() 
     let completed = currentWeather.downloadWeatherDetails() 
     if completed == "completed" { 
      self.updateUI() 
     } 
    } 

class CurrentWeather { 
    // this is CurrentWeather.swift where I save all the information in itself 
    var _cityName:String! 
    var _date:String! 
    var _weatherType:String! 
    var _currentTemp:Double! 

    var cityName: String { 
     if _cityName == nil { 
      _cityName = "" 
     } 
     return _cityName 
    } 

    var date: String { 
     if _date == nil { 
      _date = "" 
     } 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .long 
     dateFormatter.timeStyle = .none 
     let currentDate = dateFormatter.string(from: Date()) 
     self._date = "Today, \(currentDate)" 
     return _date 
    } 

    var weatherType: String { 
     if _weatherType == nil { 
      _weatherType = "" 
     } 
     return _weatherType 
    } 

    var currentTemp: Double { 
     if _currentTemp == nil { 
      _currentTemp = 0.0 
      return _currentTemp 
     } 
     return _currentTemp 
    } 

    func downloadWeatherDetails(/*completed: DownloadComplete*/) -> String { 
     let currentWeatherURl:URL = URL(string: current_weather_url)! 
     Alamofire.request(currentWeatherURl).responseJSON { response in 
      let result = response.result 
      if let dict = result.value as? Dictionary<String, AnyObject> { 
       if let main = dict["main"] as? Dictionary<String, AnyObject> { 
        if let currentTempInKev:Double = main["temp"] as? Double { 
         let currentTempInCel = Double(round(currentTempInKev - 273.15)) 
         self._currentTemp = currentTempInCel 

        } 

       } 

       if let weatherArr = dict["weather"] as? [Dictionary<String, AnyObject>] { 
        if let main = weatherArr[0]["main"] as? String { 
         self._weatherType = main.capitalized 
        }          
       } 

       if let name = dict["name"] as? String { 
        self._cityName = name      
       }     
      } 
      print(self.currentTemp) 
      print(self.weatherType) 
      print(self.cityName) 
     } 
     return "completed" 
    } 
    // the above works fine, but when called in MainViewController, properties is not rendered into UI 
} 
+0

你嘗試重新加載您的tableview? – Wolverine

+0

對不起,但它不是我的情況。這只是顯示一段,現在我還沒有爲tableview工作。無論如何,非常感謝你。 –

回答

0

要更新UI,您需要在主線程中設置UI控件的屬性。 Alamofire方法本質上是異步的,並且不會阻塞主UI線程。把它更新UILabels代碼等在

DispatchQueue.main.async { }

,它應該工作