【发布时间】:2018-09-28 00:50:14
【问题描述】:
我的 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),这样也可以显示出来,因为我现在只有用户 ID。我这样做如下:
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()
}
}
}
发生的情况是,它获取了用户信息并正确显示,但是我的第一个查询的时间顺序被破坏了。它显示同一用户的所有帖子,因此它们按 userID 而不是 postTimeStamp 排序。有没有办法解决这个问题,还是我需要完全不同的方法?
更新:到目前为止我发现了什么 当我执行 print(dict) 时,一切都以正确的顺序显示。所以错误发生在后期。当我执行 dump(self.posts) 时,这是包含所有帖子的数组,它们以错误的顺序显示。
我的猜测是,不是按照第一个查询中的请求按时间顺序附加项目,而是根据用户 ID 添加项目,因此应用程序会根据用户 ID 获取所有帖子。但是我不知道为什么会这样,我也无法在 Internet 上找到它。
【问题讨论】:
-
错误原因是你在for循环中使用了异步方法。因此,您没有按顺序获取数据,因为从 firebase 获取数据是异步方法。您必须为用户使用另一个数组并使用 useriD 管理它
-
感谢您的洞察力。至少现在我知道去哪里找了。如果我理解正确,我是否应该将帖子的数据提取到数组中,然后运行另一个函数来获取用户名和个人资料图片?或者我可以根据在 post 数组中发送的用户 ID 在 cellForItemAt 方法中运行它吗?
-
您可以在单元格中运行此项目...另一种方法是您可以为用户获取新数组并使用帖子数组的 userId 从该数据中加载用户数据。
-
非常感谢。我刚试过,它奏效了。将除 userID 之外的所有用户信息留在 post 数组之外,然后使用 post["userID"] 在 cellForItemAt 方法中运行另一个查询,返回我需要的值并相应地显示它们,直接到单元格中的元素。请添加您的解决方案作为答案,以便我可以将其标记为未来读者的解决方案。再次感谢!
标签: ios swift firebase firebase-realtime-database