2017-04-03 49 views
0

我的錯誤應該是相當明顯的,但我找不到它;Json和變量範圍

我一個全局變量初始化我的課的開頭:

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

我嘗試使用該功能

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

當我打電話來填充這個數組有一個遙遠的JSON文件我函數在viewDidLoad,然後我打印我的全局數組,它是空的(URL是正確的,json數據被正確讀取,當我讀取循環中數組附加的數據時,它會打印(所需)值。 )

在此先感謝

+1

當你閱讀'lesSemaines'?因爲我猜你的問題是由於代碼的異步部分。 – Larme

+0

這是什麼問題?陣列是空的? –

+0

在我的viewDidLoad中,我調用函數,然後嘗試打印數組,它是空的(當我直接在函數中打印它時,OK) –

回答

0

下載需要時間。引入另一個梅索德:

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 
    } 
} 
+0

覆蓋FUNC viewDidLoad中(){ super.viewDidLoad() getSemainesStages() 打印(self.lesSemaines) } –

+0

難道你不認爲它會在打印前陣完成getSemainesStages()函數? –

+0

是的,它會的。由於下載需要時間。這是異步調用的本質。但是,一切都完成後,用戶界面會得到更新。這就是爲什麼我使用額外的方法移動「print」。 – shallowThought

0

我已將您的代碼更新到Swift 3.請用下面的代碼替換它。

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

問題仍然存在;當功能打印(self.lesSemaines)它完美打印所有的數據。但在我的ViewDidLoad中,當我嘗試打印數組時,它是空的。 (我調用函數,然後嘗試打印數組) –

+0

是的,因爲當你在視圖上調用時確實加載了它的實際上是空的,並且代碼在後臺線程上運行。如果你想在viewDidLoad中打印,然後實現完成塊或稱之爲同步。 –