子项无法正常工作的firebase查询顺序

时间:2017-10-30 22:33:15

标签: ios swift firebase firebase-realtime-database

问题

我试图通过createionDate查询对象列表。由于某种原因,它不会按升序获取对象。

我的数据结构

enter image description here

我的代码

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)
}}

控制台输出

任务名称是:第三个任务

任务名称是:第二个任务

任务名称是:来自Ada的第四个任务

任务名称是:Ada的第一个任务

2 个答案:

答案 0 :(得分:1)

鉴于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

答案 1 :(得分:1)

我认为顺序是不同的,因为字典是键值对的无序集合。所以我认为既然你想以有序的方式获取值,你可以使用.childAdded的eventType,因为根据文档:

  

与返回位置的全部内容的值不同,   为每个现有的孩子触发一次childAdded,然后再触发一次   每次将新子项添加到指定路径

所以你可以修改你的代码:

  1. 首先,另一个答案指出将.value更改为let query = ref.queryOrdered(byChild: "creationDate") query.observe(.childAdded, with: { (snapshot) in...

  2. 第二次使用{{1}}代替{{1}}作为事件类型。

  3. {{1}}