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

Swift 5,从Firebase获取所有添加的子项后如何执行代码,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,在Swift 5中获取从Firebase添加的所有childadded后,如何执行一些代码 我尝试过使用DispatchGroup和observe.value,但没有一个有效 let dispatchGroup = DispachGroup() ref.child("path").observe(.childAdded, with: { (snapshot) in self.dispatchGroup.enter() //store snapshot data into a

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

我尝试过使用DispatchGroup和observe.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
}
在这种情况下,代码将在获取数据之前执行


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

当您在侦听时。childAdded,当您的代码被最后一个子级调用时,无法执行代码。因此,如果必须区别对待最后一个子函数,请侦听.value并在子函数上循环,如图所示。

一个选项是利用Firebase.value函数在.childAdded函数之后调用

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

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

从一个简单的结构开始

users
   uid_0
      name: "Jim"
   uid_1
      name: "Spock"
   uid_2
      name: "Bones"
然后,一次读取一个用户的代码,打印出他们的名字,然后在读取完所有名字后输出到控制台

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
    })
}
以及输出

Jim
Spock
Bones
--inital load has completed and the last user was read--
注意,这将在用户节点上留下一个观察者,因此如果添加了新用户,它也将打印他们的姓名


注:self.ref指向我的根firebase引用。

我认为我的答案将满足OP的要求-仔细检查我的逻辑:-是的。这是我描述的逻辑的一个很好的实现。向上投票!这两件事不会同时发生吗?第二个ObserveSingEvent必须等待第一个ObserveSingEvent的原因是什么。我理解.value在.childAdded完成后激发,但我不理解为什么,因为它们是两个完全不同的操作,一个如何知道另一个。我想到的唯一一件事是,它们都使用相同的用户。如果master ref确定了顺序,但仍然不清楚等待的是什么。Samaria,它们不是同时发生的,这是整个过程的基础。值事件总是在.childxxx事件之后调用。你可以在这里读到一些关于这一点的信息——它在管理部分,但适用于所有领域。我理解这一部分,只是奇怪的是,两个不同的流程彼此都不知道。真奇怪。感谢链接,一个选项是利用Firebase.value函数在.childAdded函数之后调用@杰伊:今天最好的发现!谢谢