如何从从 Firebase 检索信息的闭包中传递数据?

Posted

技术标签:

【中文标题】如何从从 Firebase 检索信息的闭包中传递数据?【英文标题】:How to pass data out of a closure that retrieves info from Firebase? 【发布时间】:2017-07-31 23:57:18 【问题描述】:

我正在尝试将从我的 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
        )
    

【问题讨论】:

这是因为当您从 Firebase 获取数据时,调用是异步的,因此更早地调用了外部打印。 关注link 【参考方案1】:

从 Firebase 获取数据如下

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

【讨论】:

有几件事:你不能在闭包中使用 self 引用 var messageData。它需要位于包含 let databaseREff 语句的函数之外。此外,一旦将值类型转换为 [String: AnyObject],它实际上就不再是快照了 - 只是一个命名,但更改该参数名称可以避免混淆。 我想我们可以参考,我什至已经实现了这个编码,我妈妈也没有遇到问题,是的,我正在将快照转换为 [string:anyobject] 以获得参考,我们也可以在这里使用数组.但我更喜欢使用 [string:anyobject] 因为我一次获得完整的快照并对其进行排序。稍后根据我的要求

以上是关于如何从从 Firebase 检索信息的闭包中传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

扑动 Firebase 动画列表视图如何将数据传递到详细信息屏幕

如何从 Firebase 授权中检索信息

在应用程序初始启动后,如何快速检索 Firebase Cloud Messaging 的消息传递令牌?

如何根据 android 中的用户位置从 Firebase 数据库中检索数据?

从 firebase 检索用户信息

如何访问闭包外的数组?