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() }