如何解决Firebase查询以意外顺序运行的Firebase查询问题?

时间:2019-06-24 20:31:15

标签: swift firebase firebase-realtime-database

清楚地说明了我要完成的工作:我一直在尝试获取存储在firebase中的帖子,并将其显示在collectionView中。它们应该按照从最新到最旧的顺序排序(目前已通过firebases查询成功完成),我使用timeStamp在数据库中进行跟踪:

ref.child("Timeline").child((Auth.auth().currentUser?.uid)!)
            .queryOrdered(byChild: "timeStamp")
            .queryLimited(toLast: 10)
            .observeSingleEvent(of: .value, with: { (snapshot) in

为了完成此任务,我需要首先从当前用户的时间轴中获取10个最新帖子。然后,我需要在for循环中进入Post节点,该节点存储实际的帖子并获取实际的帖子数据。然后,一旦完成,我就需要获取用户个人资料信息,以便我可以显示用户名和profileImage。


由于我已查明有问题的区域,因此我正在消除原始问题的所有混乱情况。

问题一开始出现在下面的每个循环中,就开始出现问题:

                var index = 0
                for case let rest as DataSnapshot in snapshot.children.reversed() {
                    let keyValue = rest.key
                    let UID = keyValue.split(separator: ":")[0]
                    let postIDDoubleVal = keyValue.split(separator: ":")[2]

                    self.getPost(userID: "\(UID)", postID: "post:\(postIDDoubleVal)") { post in

                        self.postArray.append(post)
                        if index == (snapshot.children.allObjects.count)-1 {
                            print("Reload")
                            self.collectionView.reloadData()
                        } else {
                            index+=1
                        }
                    }
                }

当查看数组内print语句中打印的日期时,我会看到像我期望的那样的值:21h ago-1day ago。但是当查看闭包内部的打印语句时,日期与我在collectionView中看到的现象(问题)一致。

即:帖子按日期排序,然后按用户或uid分组。基本上摆脱了他们曾经拥有的秩序。

这是提取功能:

    func getPost(userID: String, postID: String, completion: @escaping((_ completion: Post)->())) {
        let ref = Database.database().reference()

        ref.child("Posts/\(uid)/\(postID)").observeSingleEvent(of: .value, with: { snapshot in

            let userObj = User(theuserID: uid)

            self.retrieveUsersInfo(userObj: userObj) { user in
                print(user.username, " This is the username")
              }                    
        })
    }

这是检索方法:

func retrieveUsersInfo(UID: String, completion: @escaping((_ user: User)->())) {

    let ref = Database.database().reference()

    ref.child("users2").child(UID).observeSingleEvent(of: .value, with: { (snapshot) in
        //this will return a userObj
        completion(self.addUserDataToObject(uid: UID, snapshot: snapshot))

    })
 }

我该如何解决?

1 个答案:

答案 0 :(得分:1)

您尝试过这样的事情吗?

func getPost(userID: String, postID: String, completion: @escaping((_ completion: Post)->())) {
    let ref = Database.database().reference()
    let post = Post()

    ref.child("users").child(UID).observeSingleEvent(of: .value, with: { (snapshot) in
        //get user data and add to post

    })
    ref.child("Posts/\(uid)/\(postID)").observeSingleEvent(of: .value, with: { snapshot in

       //add all data to your post object
       completion(post)
    })
}

一起删除检索功能。这就是@Jay所说的完成栏可能引起问题的意思。