ios - Firebase 子查询排序无法正常工作

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

控制台输出

任务名称是:第三个任务

任务名称是:第二个任务

任务名称是:艾达的第四个任务

任务名称是:艾达的第一个任务

最佳答案

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

相关文章:

javascript - Firebasefunctions.auth.UserRecord 不是一个函数

android - 如何在 Firebase 数据库 Android 中添加新的 child

ios - 为 iOS 和 gas-preprocessor.pl 编译 ffmpeg

ios - React Native iOS pod 设置有重复的目标问题

ios - Deezer SDK IOS 按 id 播放轨道

ios - 为什么我的 ARKit Video 没有显示在应用 View 中

ios - 如何使用 swift 显示和/或隐藏 subview

firebase - 带有 FCM 推送通知的 ionic 3 在 Android 设备上不起作用

iOS Metal - 渲染一个完整的三角形

ios - 在 iOS 设备和蓝牙设备之间发送数据时是否始终需要使用蓝牙配置文件?