Swift 5,如何在从 Firebase 获取所有添加的子项后执行代码

Dif*_*hen 3 firebase swift firebase-realtime-database

在 Swift 5 中从 Firebase 获取所有添加的子项后,如何执行一些代码?

我尝试过使用 DispatchGroup 并观察 .value,但它们都没有有效地工作。

let dispatchGroup = DispachGroup()

ref.child("path").observe(.childAdded, with: { (snapshot) in
     self.dispatchGroup.enter()
     //store snapshot data into an object
     self.dispatchGroup.leave()
})

dispatchGroup.notify(queue: .main) {
    //code to execute after all children are fetched
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,代码将在获取数据之前执行。

当只有回调块到达最后一个子节点时,如何执行代码?

Jay*_*Jay 5

一种选择是利用在 .childAdded 函数之后调用 Firebase .value 函数。

这意味着 .childAdded 将迭代所有 childNode,然后在读取最后一个 childNode 后,将调用任何 .value 函数。

假设我们想要迭代用户节点中的所有用户,打印他们的名字,并在打印最后一个用户名后,输出一条所有用户都已读入的消息。

从简单的结构开始

users
   uid_0
      name: "Jim"
   uid_1
      name: "Spock"
   uid_2
      name: "Bones"
Run Code Online (Sandbox Code Playgroud)

然后一次读取一个用户的代码打印他们的名字,然后在读取所有名字后输出到控制台

var initialRead = true

func readTheUsers() {
    let usersRef = self.ref.child("users")

    usersRef.observe(.childAdded, with: { snapshot in
        let userName = snapshot.childSnapshot(forPath: "name").value as? String ?? "no name"
        print(userName)

        if self.initialRead == false {
            print("a new user was added")
        }
    })

    usersRef.observeSingleEvent(of: .value, with: { snapshot in
        print("--inital load has completed and the last user was read--")
        self.initialRead = false
    })
}
Run Code Online (Sandbox Code Playgroud)

和输出

Jim
Spock
Bones
--inital load has completed and the last user was read--
Run Code Online (Sandbox Code Playgroud)

请注意,这将在用户节点上留下一个观察者,因此如果添加新用户,它也会打印他们的名字。

Note 注意: self.ref 指向我的 root firebase 引用。