Json和可变范围

我的错误应该很明显,但我找不到;

我有一个全局variables初始化我的课程的开始:

class InscriptionStageViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { var lesSemaines = [String]() 

我尝试使用该函数与一个遥远的json文件填充这个数组

 func getSemainesStages(){ let url = URL(string: "http://www.boisdelacambre.be/ios/json/semaines.json") let task = URLSession.shared.dataTask(with: url!){ (data, response, error) in if let content = data { do { let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject let listeSemaines = myJson["semaine"] as! [[String:AnyObject]] //print(listeSemaines) for i in 0...listeSemaines.count-1 { var tabSem = listeSemaines[i] let intituleSemaine:String = tabSem["intitule"] as! String //let dateSemaine:String = tabSem["date"] as! String DispatchQueue.main.sync { self.lesSemaines.append(intituleSemaine) } } } catch { print("erreur Json") } } } task.resume() } 

当我在viewDidLoad中调用我的函数,然后打印我的全局数组时,它是空的(URL是正确的,JSON数据被正确读取,当我读取循环中数组附加的数据时,需要的价值…)

提前致谢

下载需要时间。 介绍另一种方法:

 func updateUi() { print(lesSemaines) //pickerView.reloadAllComponents() } 

并在下载完成调用它:

 func getSemainesStages(){ // ... your code let task = URLSession.shared.dataTask(with: url!){ (data, response, error) in // ... your code for tabSem in listeSemaines{ guard let intituleSemaine = tabSem["intitule"] as? String else { print("erreur Json") continue } self.lesSemaines.append(intituleSemaine) } // update UI *after* for loop DispatchQueue.main.async { updateUi() } // ... your code } } 

我已经更新了Swift 3的代码。请用下面的代码replace它。

 func getSemainesStages(){ let url = URL(string: "http://www.boisdelacambre.be/ios/json/semaines.json") let task = URLSession.shared.dataTask(with: url!){ (data, response, error) in if let content = data { do { let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] let listeSemaines = myJson["semaine"] as! [[String: Any]] for i in 0...listeSemaines.count-1 { var tabSem = listeSemaines[i] let intituleSemaine:String = tabSem["intitule"] as! String self.lesSemaines.append(intituleSemaine) } print(self.lesSemaines) } catch { print("erreur Json") } } } task.resume() }