表格视图未显示Firebase中的评论或用户名

时间:2017-03-31 00:58:59

标签: ios swift firebase firebase-realtime-database

这是我用来从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()
}

1 个答案:

答案 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委托函数可能存在问题。