.observe firebase 方法 swift4 后代码未执行

Code not executing after .observe firebase method swift4

我有一个用户注册事件的结构,注册的事件存储如下:

我正在尝试访问 registeredEvents 并在 table 视图中显示子项。到目前为止,我已经这样做了:

 override func viewDidLoad() {
    super.viewDidLoad()
    let id = Auth.auth().currentUser?.uid
    let ref = Database.database().reference()
    ref.child("users").child(id!).child("registeredEvents").observeSingleEvent(of: .value, with: { snapshot in
           print(snapshot.childrenCount)
        for rest in snapshot.children.allObjects as! [DataSnapshot] {
               print(rest.value!)
               self.eventsArray.append(rest.value!)
            }
    })

    print(eventsArray)
    self.tblEvents.dataSource = self
    self.tblEvents.delegate = self
}

它会像预期的那样打印所有子项的值,但在 observe 关闭后它不会执行任何操作。它不会打印 eventsArray 或我在打印语句中放入的任何内容。此外,eventsArray 只包含关闭前的内容。你能告诉我为什么会这样吗,需要做什么来修复它,特别是以代码的形式?

Firebase 是异步的 - 代码 运行s 比互联网快得多,所以闭包后的代码

print(eventsArray)

实际上会在代码之前运行关闭。此外,Firebase 数据仅在该闭包内有效,因此请确保您首先使用闭包中的数据。在这种情况下要更正它试试这个

 override func viewDidLoad() {
    super.viewDidLoad()

    self.tblEvents.dataSource = self
    self.tblEvents.delegate = self

    let id = Auth.auth().currentUser?.uid
    let ref = Database.database().reference()
    ref.child("users").child(id!).child("registeredEvents").observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot.childrenCount)
        for rest in snapshot.children.allObjects as! [DataSnapshot] {
            print(rest.value!)
            self.eventsArray.append(rest.value!)
        }
        print(self.eventsArray) //or refresh your tableView here
    })
}

代码将一堆 .value 对象(字典)传递给您的 eventsArray。您可能需要考虑制作对象来保存该字典数据并将这些对象添加到数组中。

    for restSnap in snapshot.children.allObjects as! [DataSnapshot] {
       let event = EventClass(withSnap: restSnap)
       self.eventsArray.append(event)
    }

dataSource 数组看起来像这样

var eventsArray = [EventClass]()

并且 EventClass 将是

class EventClass {
    var first_name = ""
    var event_key = ""

    init(withSnap: DataSnapshot) {
        self.event_key = withSnap.key
        self.first_name = withSnap.childSnapshot(forPath: "First name").value ?? "No first name"
        let registeredEventsSnap = withSnap.childSnapshot(forPath: "registeredEvents")
        //iterate over the registeredEventsSnap to get all the events
    }
}