这是我用来从firebase获取用户的评论和用户名以在我的tableview单元格中显示以供评论的代码。它目前没有显示任何内容,但是当我发布评论时,它会通过,我可以在firebase数据库中看到它。我只需要读取所有注释数据并显示它。
func fetchComment()
{
let ref = FIRDatabase.database().reference().child("Newsfeed").child(itemSelected.title)
ref.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.hasChild("comments")
{
ref.child("comments").observeSingleEvent(of: .value, with: {snappy in
for comPosted in snappy.children.allObjects as! [FIRDataSnapshot]
{
let commentPosted = comment()
guard let comDict = comPosted.value as? [String: AnyObject]
else
{
continue
}
commentPosted.commentText = comDict["userComment"] as! String!
commentPosted.username = comDict["userId"] as! String!
self.comments.append(commentPosted)
}
})
}
})
self.commentTableView.reloadData()
ref.removeAllObservers()
}
答案 0 :(得分:1)
Firebase是异步的,因此代码需要允许Firebase时间从服务器返回数据。该数据仅在闭包中有效,闭包外的任何代码都将在代码内部执行。代码比互联网快得多!
因此,在for循环之后移动tableView.reloadData将确保在填充dataSource数组之后执行它。
此外,代码中的两个观察事件是单个事件 - 这意味着它们不会保持与节点的连接,因此removeAllObservers是无关紧要的。
let ref = FIRDatabase.database().reference().child("Newsfeed")
.child(itemSelected.title)
ref.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.hasChild("comments")
{
ref.child("comments").observeSingleEvent(of: .value, with: {snappy in
for comPosted in snappy.children.allObjects as! [FIRDataSnapshot]
{
let commentPosted = comment()
let comDict = comPosted.value as! [String: AnyObject]
commentPosted.commentText = comDict["userComment"] as! String!
commentPosted.username = comDict["userId"] as! String!
self.comments.append(commentPosted)
}
self.commentTableView.reloadData()
//A quick check to ensure the array is populated.
//Can be removed.
for c in self.comments {
print(c.commentText)
print(c.username)
}
})
}
})
以上代码经过测试并且可以工作,如果tableview仍未显示数据,则tableView委托函数可能存在问题。