问题
我正在尝试按 createionDate 查询对象列表。由于某种原因,它不会按升序获取对象。
我的数据结构
我的代码
func fetchQuest() {
guard let uid = selectedUID else {return}
let ref = FIRDatabase.database().reference().child("questsByUID").child(uid)
let query = ref.queryOrdered(byChild: "CreationDate")
query.observeSingleEvent(of: .value, with: { (snapshot) in
guard let dictionaries = snapshot.value as? [String: Any] else {return}
dictionaries.forEach({ (key, value) in
guard let dictionary = value as? [String : Any] else {return}
let quest = Quest(uid: uid, dictionary: dictionary)
quest.questID = key
print("quest name is: ", quest.questName)
self.board.append(quest)
})
self.collectionView?.reloadData()
}) { (err) in
print("unable to fetch quest:", err)
}
}
我的模型
class Quest {
var questID = ""
let questName: String
let creatorUID: String
let creationDate: Date
init(uid: String, dictionary: [String: Any]) {
self.questName = dictionary["questName"] as? String ?? ""
self.creatorUID = uid
let secondsFrom1970 = dictionary["creationDate"] as? Double ?? 0
self.creationDate = Date(timeIntervalSince1970: secondsFrom1970)
}}
控制台输出
任务名称是:第三个任务
任务名称是:第二个任务
任务名称是:艾达的第四个任务
任务名称是:艾达的第一个任务
最佳答案
鉴于 Firebase 数据库区分大小写,请尝试将查询更改为:
let query = ref.queryOrdered(byChild: "CreationDate")
至:
let query = ref.queryOrdered(byChild: "creationDate")
您的 Quest
模型类已使用正确的拼写。
更新。正如另一个答案所提到的,字典不保持顺序。因此,您应该改用 FIRDataSnapshot.children 迭代器。例如:
query.observeSingleEvent(of: .value) {
(snapshots) in
for child in snapshots.children {
let snapshot = child as! DataSnapshot
guard let dictionary = snapshot.value as? [String : Any] else { return }
let quest = Quest(uid: uid, dictionary: dictionary)
quest.questID = snapshot.key
...
}
}
请注意,我仍然使用与您的原始代码相同的 observeSingleEvent
。
关于ios - Firebase 子查询排序无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47025221/