Важно понимать разницу между чтением узла по .value и .childAdded, и еще одно соображение - отсоединение ключей родительского узла от данных, которые он содержит.
Начните со следующей структуры
channels
chan_0
image: "hiru_fm_logo.png"
name: "HiruFM"
title "Hiru FM"
chan_1
image: "sirasa_fm_logo.png"
name: "SirasaFM"
title "Sirasa FM"
chan_0, chan_1 и т. Д. Ключи создаются с помощью childbyAutoId и позволяют отделить ключи от дочерних данных. Таким образом, если одно из дочерних значений изменяется, оно сохраняет целостность между родительским узлом и другими узлами, которые на него ссылаются. На практике, если HiruFM становится HiruXM, все, что нужно сделать, это изменить дочерний узел, а не родительский.
Тогда структура для хранения ваших данных. Обратите внимание, что структура init разбивает снимок и назначает свойства
struct ChannelStruct{
var image = ""
var title = ""
var name = ""
init(aSnap: DataSnapshot) {
let dict = aSnap.value as! [String: Any]
if let image = dict["image"] as? String {
self.image = image
}
if let title = dict["title"] as? String {
self.title = title
}
if let name = dict["name"] as? String {
self.name = name
}
}
}
и массив классов для хранения структур
var channels = [ChannelStruct]()
и, наконец, код для чтения в узле и итерации по дочерним узлам, чтобы добавить их в массив
ref = Database.database().reference().child("channels")
ref.observeSingleEvent(of: .value) { snapshot in
if snapshot.exists() {
for child in snapshot.children {
let snap = child as! DataSnapshot
let aChannel = ChannelStruct(aSnap: snap)
self.channels.append(aChannel)
}
} else {
print("no channels found")
}
}
Обратите внимание, что при чтении по .value, родительскому узлу, channel , считываются ВСЕ дочерние узлы, поэтому они должны повторяться для получения каждого дочернего узла - это также поддерживает их порядок. Принимая во внимание, что если мы используем .childAdded, он представляет каждый дочерний узел по одному, поэтому итерация не требуется.