Я думаю, что вы спрашиваете, как выполнить итерацию по ряду узлов, получить дочерние ключи других узлов от этого узла, а затем прочитать данные из другого узла на основе этих ключей.
Позвольте мне Начнем со структуры Firebase, которая должна помочь прояснить
MainTree
subTree1
some_node
subTree2_0: true
subTree2_1: true
subTree2_2: true
subTree2
subTree2_0:
user_name: "Larry"
subTree2_1:
user_name: "Moe"
subTree2_1:
user_name: "Curly"
Это должно соответствовать структуре в вопросе.
Мы собираемся перебрать дочерние узлы, расположенные в MainTree / subTree1 / some_node, чтобы получить узлы, которые мы хотим прочитать из subTree2. Я не знал, каков был some_node по отношению к остальным данным, поэтому я просто назвал его ... some_node.
Этот первый раздел кода сразу читает дочерние узлы узла subTree1, затем перебирает их чтобы получить каждый дочерний ключ - этот дочерний ключ (например, subTree2_0) соответствует дочернему узлу в subTree2
func readMainTree() {
let mainTreeRef = self.ref.child("MainTree")
let subTree1Ref = mainTreeRef.child("subTree1")
let someNodeRef = subTree1Ref.child("some_node")
someNodeRef.observeSingleEvent(of: .value, with: { snapshot in
let childNodes = snapshot.children.allObjects as! [DataSnapshot]
for childSnap in childNodes {
self.readSubTree2At(node: childSnap.key)
}
})
}
В пределах for..l oop мы получаем каждый дочерний ключ и передаем его функции который читает дочерние данные (имя_пользователя) и распечатывает их.
func readSubTree2At(node: String) {
let mainTreeRef = self.ref.child("MainTree")
let subTree2Ref = mainTreeRef.child("subTree2")
let childRef = subTree2Ref.child(node)
childRef.observeSingleEvent(of: .value, with: { snapshot in
let userName = snapshot.childSnapshot(forPath: "user_name").value as? String ?? "No Name"
print(userName)
})
}
и вывод:
Larry
Mo
Curly
Вы можете бросить dispatchGroup в микс, если хотите .. вот решение с использованием DispatchGroup
func readMainTreeWithDispatch() {
let mainTreeRef = self.ref.child("MainTree")
let subTree1Ref = mainTreeRef.child("subTree1")
let someNodeRef = subTree1Ref.child("some_node")
someNodeRef.observeSingleEvent(of: .value, with: { snapshot in
let childNodes = snapshot.children.allObjects as! [DataSnapshot]
let myGroup = DispatchGroup()
for childSnap in childNodes {
let mainTreeRef = self.ref.child("MainTree")
let subTree2Ref = mainTreeRef.child("subTree2")
let childRef = subTree2Ref.child(childSnap.key)
myGroup.enter()
childRef.observeSingleEvent(of: .value, with: { snapshot in
let userName = snapshot.childSnapshot(forPath: "user_name").value as? String ?? "No Name"
print(userName)
myGroup.leave()
})
}
myGroup.notify(queue: .main) {
print("Finished reading all user names.")
}
})
}
и вывода
Larry
Mo
Curly
Finished reading all user names.