2017-07-08 96 views
0

這是我從firebase中提取數據的代碼。
listofnames(二維)和名稱(單維)是String類型的全局數組。全局變量似乎失去了價值(swift)

但是,當我打印listofnames時,輸出窗口中會顯示一個空數組,而如果我在註釋第一行(self.listofnames = [[]])時代碼正常工作。

我已將鏈接引用與Firebase數據庫

請幫忙。

var databasehandle:FIRDatabaseHandle? 

let time = ["8AM - 9AM", "9AM - 10AM","10AM - 11AM", "11AM -12PM", "12PM - 1PM","1PM - 1:30PM","2PM - 3PM","3PM - 4PM","4PM - 5PM","5PM - 6PM","6PM - 7PM","7PM - 7:30PM"] 

var ref:FIRDatabaseReference! 
var day: String = "Monday" 
var users :String = "First years" 

func loaddata() 
{ 
    self.listofnames = [[]] 
    for x in 0...((time.count)-1) 
    { 
     ref.child(users).child(day).child(time[x]).observeSingleEvent(of: .value, with: {(snapshot) -> Void in 
      if let namesfromFirebase = snapshot.value as? [String:Any] 
      { 
       let y = namesfromFirebase.count 
       for i in 1...y 
       { 
        self.names.append(namesfromFirebase["s"+"\(i)"] as! String) 
       } 
      } 
      self.listofnames.append(self.names) 
      self.names = [] 
     }) 
    } 
    print(self.listofnames) 
    self.tableView.reloadData() 
} 

回答

0

observeSingleEvent異步工作,閉包稍後調用。

有一個簡單的解決方案:移動兩行封閉:

func loaddata() 
{ 
    self.listofnames = [[]] 
    for x in 0..<time.count // no parentheses and math needed when using `..<` 
    { 
     ref.child(users).child(day).child(time[x]).observeSingleEvent(of: .value, with: {(snapshot) -> Void in 
       if let namesfromFirebase = snapshot.value as? [String:Any] 
       { 
        let y = namesfromFirebase.count 
        for i in 1...y 
        { 
         self.names.append(namesfromFirebase["s"+"\(i)"] as! String) 
        } 
       } 
       self.listofnames.append(self.names) 
       self.names = [] 
       print(self.listofnames) 
       self.tableView.reloadData() 
     }) 
    } 
} 
+0

我將使用的變量的內容,從一個不同的功能...,然後將陣列保持空 –

+0

然後你需要一個完成處理程序,或者在閉包中放置使用該變量的代碼。 – vadian