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

Posted

技术标签:

【中文标题】.observe firebase 方法 swift4 后代码未执行【英文标题】:Code not executing after .observe firebase method swift4 【发布时间】:2020-01-04 05:28:00 【问题描述】:

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

我正在尝试访问已注册的事件并在表格视图中显示子项。到目前为止,我已经这样做了:

 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

它按预期打印所有孩子的值,但在观察关闭之后它不会做任何事情。它不会打印 eventsArray 或我在打印语句中放入的任何内容。此外, eventsArray 只包含它在关闭之前拥有的东西。您能否让我知道为什么会发生这种情况,以及需要做些什么来解决它,特别是以代码的形式?

【问题讨论】:

【参考方案1】:

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
    

【讨论】:

以上是关于.observe firebase 方法 swift4 后代码未执行的主要内容,如果未能解决你的问题,请参考以下文章

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

如何过滤 Observable 数组?

Firebase:如何在observeSingleEvent() 之后删除Observer(withHandle:)?

无法使用 Observable、Firebase (Angular 6) 为 var 赋值

观察 Vue Observable 的变化

从 Firebase 列表 Observables 数组转到字符串数组