如何通过完成处理程序使用JSON结果更新UI?

时间:2016-12-31 23:14:55

标签: ios json swift nsurlsession

我正在尝试根据JSON返回的数据更新一些标签。以下是数据对象和更新JSON数据对象的函数:

class sampleJSON {


  var airbnbUS: Int?
  var airbnbLocal: Int?


  init(airbnbUS: Int, airbnbLocal: Int?) {
    self.airbnbUS = airbnbUS
    self.airbnbLocal = airbnbLocal
  }

  //Used to download data to local objects using the network service manager
  static func downloadAllData(urlExtension: String, completionHandler: @escaping (sampleJSON?) -> ()) {

    let usm = UrlSessionNetworkManager.sharedManager

    if let jsonDictionary = usm.parseJSONFromData(urlExtension:"\(urlExtension)")

    {
      if let resultsDictionary = jsonDictionary["result"] as? [[String : Any]]?{
        let costDictionary = resultsDictionary?[0]
        let cost = costDictionary?["cost"] as? [String: Any]

        if let airbnb = cost?["airbnb_median"] as? [String: AnyObject]{
            let airbnbUS = airbnb["USD"] as! Int
            let airbnbLocal = airbnb["CHF"] as! Int

         sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal)
        }
      }
    } else {
      print("Error: Cannot retrieve JSON Data")
    }
  }
}

这是我正在尝试更新UI的地方:

var JSON: sampleJSON?

 override func viewDidLoad() {
    super.viewDidLoad()

       sampleJSON.downloadAllData(urlExtension:"cities/basel-switzerland",completionHandler: {_ in

  DispatchQueue.main.async(execute: {
  self.topLabel.text = String(describing: self.JSON?.airbnbUS)
  self.lowerLabel.text = String(describing: self.JSON?.airbnbLocal)
   })
})

截至目前,当调用viewDidload时,标签为空白,我尝试在完成块的末尾添加self.view.setNeedsDisplay(),但标签仍为空白。  编辑:我注意到如果我在viewDidLoad中的完成块中放置一个断点,它就不会被调用。

1 个答案:

答案 0 :(得分:4)

您永远不会在.command("customer1 <place> [language]","Create a customer directory")内调用您的完成处理程序,因此它的闭包将永远不会执行以设置您的标签。

代替您创建downloadAllData并且不对其执行任何操作的行:

sampleJSON

sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal) 内返回sampleJSON

completionHandler