我的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 回答
原因:
错误背后的原因是,你在for循环中使用了异步方法 .
因此您没有按顺序获取数据,因为从firebase获取数据是异步方法 . 你必须为用户使用另一个数组并使用useriD进行管理
解: