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

标签 ios swift firebase firebase-realtime-database swift4

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

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/

相关文章:

ios - 如何在 Swift 中删除属于同一对象的所有对象

ios - 如何为 MapKit 用户位置创建自定义标注 View ?

android - 无法在 ImageView 中设置 Firebase Image Uri

android - Firebase 和 Android 上的新 Google 登录

iphone - 如何使用全局/静态变量 OBJ-C

swift - TouchesBegan 上使用 Sprite Kit 的 SkNode 名称为 nil

ios - 对 SwiftUI FetchRequest 的更改未触发 View 刷新?

ios - 如何同时呈现和解散

ios - 如何使用 Geofire 和 Firebase 对结果进行分页

ios - 如何转换数字类型?