【问题标题】:Code not executing after .observe firebase method swift4.observe firebase 方法 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 只包含它在关闭之前拥有的东西。您能否让我知道为什么会发生这种情况,以及需要做些什么来解决它,特别是以代码的形式?

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database swift4


    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多