我目前正在从Firebase数据库中检索数据,并将数据存储在字典中。当我尝试像这样在字典中列出键时:snapDict?.keys
元素的索引与它们在数据库中的索引不同。
Database.database().reference().child("\(UserData().mySchool!)/posts").observeSingleEvent(of: .value, with: { (snapshot) in
print(snapshot.childrenCount)
let snapDict = snapshot.value as? [String: Any]
print(snapshot.value!)
let names = snapDict?.keys
print(names!)
for id in names! {
self.searchNames(id: id)
self.tableView.reloadData()
}
})
因此,您会认为将它们放入字典时会以-LJRUC8n........-LOF6JUdm-onVuaq-zij
打印吗?
snapDict?.keys
打印:
["-LOBSAv_l5_x1xnKwx3_", "-LJRUC8nPF3Vg-DDGiYQ", "-LOBLXpTs39yLZo6EnHl", "-LOF6JUdm-onVuaq-zij", "-LODhXPQi8G7MX1bSfeb", "-LJaUiEnGOcBjKsTWSCS", "-LOBLZzrLAlzkhoidnKf"]
我在这里找不到顺序/模式。按字母顺序?知道为什么订单会以这种方式出现吗?
答案 0 :(得分:4)
根据定义,字典中的键是无序的。因此,当您将快照转换为字典时,所有关于节点顺序的信息都会丢失。
最重要的是,您在读取数据之前无需指定顺序。
要同时解决这两个问题:
Database.database().reference()
.child("\(UserData().mySchool!)/posts")
.queryOrderedByKey()
.observeSingleEvent(of: .value, with: { (snapshot) in
print(snapshot.childrenCount)
for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
print(child.value)
}
})