我正在尝试使用observe(.childAdded)检索一些数据,以便获取项目的新“帖子”并将其正确添加到tableview中。 实际上我使用这个函数得到了我需要的结果。
databaseHandle = ref?.child("Posts").observe(.childAdded, with: { (snapShot) in
let post = snapShot.value as? String
if let actualPost = post {
self.postData.insert(actualPost, at: 0)
self.tableView.reloadData()
}
})
但它仅适用于在FireBase中具有此值的子项:
*Root
*Posts
*ChildByAutoId: "post text value"
实际上我想要的是一个有这样属性的孩子:
*Root
*Posts
*ChildByAutoId
-Text: "post text value"
-UserId: "userId"
-CreationDate: "date"
-PostId: "PostId"
-Likes: Int
-Author: "name"
我希望得到与使用.observe(.childAdded)相同的结果,但我无法做到。 我发现它目前工作的唯一方法是:
func recuperarData(){
let ref = self.ref
ref?.child("Posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapShot) in
if let posts = snapShot.value as? [String : AnyObject]{
for (_, value) in posts{
let post = Posts()
if let autor = value["Author"] as? String ,let likes = value["Likes"] as? Int, let fecha = value["CreationDate"] as? String, let postId = value["PostID"] as? String, let texto = value["Text"] as? String, let userID = value["UserId"] as? String {
post.autor = autor
post.likes = likes
post.fecha = fecha
post.PostId = postId
post.texto = texto
post.UserId = userID
self.posts.append(post)
}
}
self.tableView.reloadData()
}
})
ref?.removeAllObservers()
}
但这只检索了所有数据每次我“重新加载”tableview并且没有按照我想要的顺序正确添加帖子。
有人知道使用.observe(.childAdded)获取此数据的正确方法,因此我可以自动升级tableview。
我正在使用Xcode 8.2.1和swift 3 感谢
答案 0 :(得分:0)
我很震惊没有人能够在原来的.childAdded
函数中提出问题。
let post = snapShot.value as? String
是问题所在。
Firebase数据库是键值配对,因此您无法将整个结果转换为字符串。您在执行.value
时通过将其转换为字典来解决此问题。在.childAdded
函数中执行相同的操作。
我在Firebase中有类似的answer解释词典处理。