首页 文章

使用不同的查询在帖子中获取Firebase用户信息

提问于
浏览
1

我的Firebase实时数据库中有两个表:帖子和用户 . 结构是:

users
-- userID
---- userName
---- userProfilePicURL

posts
-- postID
---- postTimeStamp
---- postTitle
---- postContent

现在,我在函数loadData()中获取数据,如下所示:

var Ref: DatabaseReference!
Ref = Database.database().reference()

Ref.child("posts").queryOrdered(byChild: "postTimeStamp").observeSingleEvent(of: .value) { (snapshot) in

    for child in snapshot.children {

        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]

        // set all additional information and append to array

        self.collectionView?.reloadData()

    }

}

这很好用 . 但是,我想运行第二个查询来获取用户信息(userName,userProfilePicURL),这样也可以显示,因为我现在拥有的只是userID . 我这样做如下:

var Ref: DatabaseReference!
Ref = Database.database().reference()

Ref.child("posts").queryOrdered(byChild: "postTimeStamp").observeSingleEvent(of: .value) { (snapshot) in

    for child in snapshot.children {

        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]

        Ref.child("users").child(dict["userID"] as! String).observeSingleEvent(of: .value, with: { (snapUser) in

            let valueUser = snapUser.value as! [String: Any]

            // set all additional information and append to array

            self.collectionView?.reloadData()

        }

    }

}

但是会发生什么,它获取用户信息并正确显示它,但我的第一个查询的时间顺序被破坏了 . 它显示同一用户的所有帖子,因此它们按用户ID排序,而不是按postTimeStamp排序 . 有没有解决这个问题,还是我需要解决这个问题?

UPDATE: What I have found so far 当我执行print(dict)时,所有内容都以正确的顺序显示 . 所以错误发生在后期 . 当我执行dump(self.posts),这是包含所有帖子的数组时,它们以错误的顺序显示 .

我的猜测是,不是按照第一个查询中的请求按时间顺序附加项目,而是根据userID添加它们,因此应用程序会获取每个userID的所有帖子 . 我不知道为什么会这样,我也无法在互联网上找到它 .

1 回答

  • 0

    原因:

    • 错误背后的原因是,你在for循环中使用了异步方法 .

    • 因此您没有按顺序获取数据,因为从firebase获取数据是异步方法 . 你必须为用户使用另一个数组并使用useriD进行管理

    解:

    • 您可以在单元格内运行此项目...另一种方法是您可以为用户获取新数组并加载用户's data from that data using userId of post' s数组 .

相关问题