【问题标题】:Firebase queryOrderedByKey not sorting posts chronologicallyFirebase queryOrderedByKey 未按时间顺序对帖子进行排序
【发布时间】:2017-08-10 18:24:55
【问题描述】:

我的应用有一个收藏视图,其中显示来自 Firebase 的照片/图像行,我希望它们按添加顺序加载,最新帖子位于顶部。我认为默认情况下使用queryOrderedByKey 会这样做,这就是我在 fetch 函数中使用的,但是帖子是乱序的。

这就是我目前获取帖子的方式:

func fetchPosts() {

    let ref = FIRDatabase.database().reference()
    ref.child("users").queryOrderedByKey().observe(.value, with: { snapshot in

        let users = snapshot.value as! [String : AnyObject]

        for (_, value) in users {

            if let uid = value["uid"] as? String {

                if uid == FIRAuth.auth()?.currentUser?.uid {

                    if let followingUsers = value["following"] as? [String : String] {

                        for (_, user) in followingUsers {
                            self.following.append(user)
                        }
                    }
                    self.following.append(FIRAuth.auth()!.currentUser!.uid)

                    ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snap) in
                        let postsSnap = snap.value as! [String : AnyObject]

                        for (_, post) in postsSnap {
                            if let userID = post["userID"] as? String {
                                for each in self.following {
                                    if each == userID {

                                        let posst = Post()
                                        if let poster = post["poster"] as? String, let likes = post["likes"] as? Int, let pathToImage = post["pathToImage"] as? String, let postID = post["postID"] as? String {

                                            posst.poster = poster
                                            posst.likes = likes
                                            posst.pathToImage = pathToImage
                                            posst.postID = postID
                                            posst.userID = userID
                                            if let people = post["peopleWhoLike"] as? [String : AnyObject] {
                                                for (_, person) in people {
                                                    posst.peopleWhoLike.append(person as! String)
                                                }
                                            }
                                            posts.append(posst)
                                        }
                                    }
                                }
                                self.collectionView.reloadData()
                            }
                        }
                    })
                    ref.removeAllObservers()
                }
            }
        }
    })
}

如何让帖子按最新的优先排序?

编辑 2:更新 - 现在从最旧 -> 最新排序

func fetchPosts() {

    let ref = FIRDatabase.database().reference()
    ref.child("users").queryOrderedByKey().observe(.value, with: { snapshot in

        let users = snapshot.value as! [String : AnyObject]

        for (_, value) in users {

            if let uid = value["uid"] as? String {

                if uid == FIRAuth.auth()?.currentUser?.uid {

                    if let followingUsers = value["following"] as? [String : String] {

                        for (_, user) in followingUsers {
                            self.following.append(user)
                        }
                    }
                    self.following.append(FIRAuth.auth()!.currentUser!.uid)

                    ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snap) in

                        for postSnapshot in snap.children.allObjects as! [FIRDataSnapshot] {
                            let value = postSnapshot.value as! [String : AnyObject]

                            if let userID = value["userID"] as? String {
                                for each in self.following {
                                    if each == userID {

                                        let posst = Post()
                                        if let poster = value["poster"] as? String, let likes = value["likes"] as? Int, let pathToImage = value["pathToImage"] as? String, let postID = value["postID"] as? String {

                                            posst.poster = poster
                                            posst.likes = likes
                                            posst.pathToImage = pathToImage
                                            posst.postID = postID
                                            posst.userID = userID
                                            if let people = value["peopleWhoLike"] as? [String : AnyObject] {
                                                for (_, person) in people {
                                                    posst.peopleWhoLike.append(person as! String)
                                                }
                                            }
                                            posts.append(posst)
                                        }
                                    }
                                }
                                self.collectionView.reloadData()
                            }
                        }
                    })
                    ref.removeAllObservers()
                }
            }
        }
    })
}

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database uicollectionview


    【解决方案1】:

    查询按请求的顺序返回匹配子节点的快照。这意味着结果包括三件事:

    1. 项目键
    2. 项目值
    3. 项目相对于彼此的顺序

    但是你对快照做的第一件事是:

    ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snap) in
      let postsSnap = snap.value as! [String : AnyObject]
    

    您将快照转换为字典。字典只有两个空间:键和值。所以此时顺序丢失了,因为字典有一个未定义的顺序。

    按照您请求的顺序访问结果的正确方法是使用快照的内置子集合来迭代它们:

    ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in
    
      for postSnapshot in snapshot.children {
        let value = postSnapshot.value as! [String : AnyObject]
    

    这将按照您查询的顺序遍历匹配的子级。

    【讨论】:

    • 谢谢!当尝试这样做时,Xcode 抛出一个错误并建议将let value = postSnapshot.value as! [String : AnyObject] 更改为let value = (postSnapshot as AnyObject).value as! [String : AnyObject],然后给我另一个错误,“value 的模糊使用”
    • 感谢您的链接,我更改了我的代码(我编辑了我的问题以添加更新的代码),现在帖子从最旧到最新排序,知道如何切换它吗?我尝试在allObjects 之后添加.reversed(),但收到警告,然后在运行时崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2017-07-20
    • 1970-01-01
    • 2012-09-19
    • 2014-06-07
    • 2012-02-18
    相关资源
    最近更新 更多