2017-07-31 62 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],因为我一次获得完整的快照并对其进行分类。后来根据我的要求 –