gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:21:38 25 4
gpt4 key购买 nike

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

enter image description here

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

 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 是异步的 - 代码运行速度比互联网快得多,所以闭包之后的代码

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
}
}

关于ios - .observe firebase 方法 swift4 后代码未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59588174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com