2017-07-31 16 views
0

我試圖將我從我的firebase數據庫檢索到的數據傳遞到我的單身人員的字段中。數據通過閉包接收,並在該閉包中傳遞一些數據到我的單身人士的屬性。如果我在封閉內部打印數據結構(在分配了所有東西之後),我得到了我期望的輸出,但是如果我在所有數據傳入之後將其打印在初始化程序的末尾,則它是空的。如何將數據傳遞給從Firebase中檢索信息的閉包?

import Foundation 
import Firebase 

class EmployeeList { 
    static let sharedInstance = EmployeeList() 
    var employeeDictionary: [String: [EmployeeData]] 
    var ref: DatabaseReference! 

    private init() { 
     employeeDictionary = [String: [EmployeeData]]() 
     ref = Database.database().reference() 

     ref.child("employeeList").observeSingleEvent(of: .value, with: { snapshot in 
      if let dictionary = snapshot.value as? [String: [String: AnyObject]] { 
       for subsection in dictionary { 
        var subsectionEmployees: [EmployeeData] = [] 

        for item in subsection.value { 
         self.ref.child("employeeList/\(subsection.key)/\(item.key)").observeSingleEvent(of: .value, with: { employeeSnapshot in 
          let employeeObject = EmployeeData(snapshot: employeeSnapshot) 
          subsectionEmployees.append(employeeObject) 
          self.employeeDictionary[subsection.key] = subsectionEmployees 
          //print(self.employeeDictionary) This print statement prints out the expected data every time another employee is appended 
         }) 
        } 
       } 
      } 
      //print(self.employeeDictionary) This print statement prints an empty data structure 
     }) 
    } 
} 
+0

這是因爲當您從Firebase獲取數據時,調用是異步的,因此外部打印會在之前調用。 –

+0

請按照此鏈接(https://stackoverflow.com/questions/38364288/getting-data-out-of-a-closure-that-retrieves-data-from-firebase?rq=1) –

回答

0

得到火力地堡數據如下

var messagedata = [String:AnyObject]() 

let databaseReff = Database.database().reference().child("message") 

databaseReff.queryOrdered(byChild: "fromId").queryEqual(toValue: self.recieverId).observe(.value, with: { snapshot in 
     if snapshot.exists(){ 
      self.messagedata = snapshot.value! as! [String : AnyObject]   
      self.getAllMessagesSent(snapshot: self.messagedata) 
     } else 
      self.getAllMessagesSent(snapshot: self.messagedata) //Function Created 
     } 
}) 

傳球Clousre獲取到字典和數據字典傳遞給一個函數,做你想做的事,或者使用轉義塊什麼

func getAllMessagesSent(snapshot: [String:AnyObject]) { 
    //data is here 
} 
+0

幾件事:你不能使用self在閉包中引用var messageData。它需要在封裝let databaseREff語句的函數之外。而且,一旦這個值被作爲[String:AnyObject]的類型轉換,它實際上不再是一個快照 - 只是一個命名的事情,但改變這個參數名稱可以避免混淆。 – Jay

+0

我想我們可以參考,我甚至實現了這種編碼我也沒有得到問題,是的,我正在轉換快照到[字符串:anyobject]得到一個參考,我們也可以在這裏使用一個數組。但我更喜歡使用[string:anyobject],因爲我一次獲得完整的快照並對其進行分類。後來根據我的要求 –

相關問題