2016-12-14 3 views
1

Это мой сценарий. Я начинаю с json api из openweather, а затем создаю класс Weather с некоторыми свойствами. Внутри объекта Weather я создаю функцию с именем downloadWeather для фактического анализа api, тогда я разрешаю анализируемое значение сохранять в свойствах.Содержимое от JSON фактически не отображается в UI

Например, self.max_temp = valueParsedFromJSON. Затем в MainViewController, внутри ViewDidload, я создаю экземпляр Weather, который является функцией погоды, вызовите функцию downloadWeather, а затем обновите метку ui, соответствующую weather.somproperty. Содержимое, загруженное в консоль (только для отладки), прекрасно, но оно вообще не отображает содержимое в 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

Извините, но это не мое дело. Это просто отображается для раздела, теперь я пока не работаю для просмотра таблиц. В любом случае, спасибо вам большое. –

ответ

0

Для обновления пользовательского интерфейса вам необходимо установить свойства элементов управления пользовательского интерфейса в основном потоке. Alamofire методы носят асинхронный характер и не блокируют основные потоки пользовательского интерфейса. Поместите код, который обновляет UILabels и т.д. в

DispatchQueue.main.async { }

и он должен работать

Смежные вопросы