如何检索评论/帖子的键

Posted

技术标签:

【中文标题】如何检索评论/帖子的键【英文标题】:How to retrieve the keys of a comment/post 【发布时间】:2019-10-06 02:32:43 【问题描述】:

我很难同时检索 postId 和 commentId。

目标是允许用户删除自己对帖子的评论。

这是评论结构,下面是一个应该删除用户评论的函数,但是由于某种原因,我只能返回commentId而不是postId。因此,单击时不会删除评论。

如果我在 deleteComment 的最后一行运行断点,postId 将 = nil,但如果我在 func fetchComment 的最后一行运行断点,postId 将返回 postId 的任何内容。


struct Comment 
    var commentId: String!
    let user: User
    var creationDate: Date!
    let text: String
    let uid: String!

    init(commentId: String!,user: User, dictionary: [String: Any]) 
        self.commentId = commentId
        self.user = user
        self.text = dictionary["text"] as? String ?? ""
        self.uid = dictionary["uid"] as? String ?? ""

        if let creationDate = dictionary["creationDate"] as? Double 
            self.creationDate = Date(timeIntervalSince1970: creationDate)
        

    

    var post: Post?


    func deleteComment() 

        guard let postId = self.post?.postId else  return 
        guard let commentId = self.commentId else  return 

     let commentsRef = Database.database().reference().child("comments")
        commentsRef.child(postId).child(commentId).removeValue()




    

这是获取 cmets 的方式



    var comments = [Comment]()


    func fetchComments() 
        guard let postId = self.post?.postId else  return 
        let ref = Database.database().reference().child("comments").child(postId)
        ref.observe(.childAdded, with:  (snapshot) in

            let commentId = snapshot.key
            //print(commentId)
            guard let dictionary = snapshot.value as? [String: Any] else  return 
            guard let uid = dictionary["uid"] as? String else  return 
            Database.fetchUserWithUID(with: uid, completion:  (user) in
                let comment = Comment(commentId: commentId, user: user, dictionary: dictionary)

                self.comments.append(comment)
                self.collectionView?.reloadData()
            )


        )  (err) in
            print("Failed to observe comments")
        

    

另外,这里是用户提交评论时的代码


 func didSubmit(for comment: String) 

        guard let uid = Auth.auth().currentUser?.uid else  return 

        print("post id:", self.post?.postId ?? "")

        print("Inserting comment:", comment)


        let postId = self.post?.postId ?? ""
        let values = ["text": comment, "creationDate": Date().timeIntervalSince1970, "uid": uid] as [String : Any]

        Database.database().reference().child("comments").child(postId).childByAutoId().updateChildValues(values)  (err, ref) in

            if let err = err 
                print("Failed to insert comment:", err)
                return
            

            self.uploadCommentNotificationToServer()

            if comment.contains("@") 
                self.uploadMentionNotification(forPostId: postId, withText: comment, isForComment: true)
            

            self.containerView.clearCommentTextView()
        

        

通过 firebase 用于 cmets 的 Json

  "comments" : 
    "-Lord0UWPkh5YdGIHtAO" : 
      "-Lp7AQzHccme5RcRsyDd" : 
        "creationDate" : 1.568874020882821E9,
        "text" : "Wow Cool!",
        "uid" : "wELwYnMGxxW0LJNRKBuuE2BUaV93"
      
    ,
    "-LowvCk-agvJbK0VF-Bq" : 
      "-LpKm1NcgOsXhwj6soxE" : 
        "creationDate" : 1.569102243436777E9,
        "text" : "Nice!",
        "uid" : "wELwYnMGxxW0LJNRKBuuE2BUaV93"
      ,

【问题讨论】:

一种选择是使 postId 成为 Comment 结构中的属性,但听起来更像是self.post 属性的问题 你能给我举个例子来说明你如何让它成为一个属性吗? 就像该结构中的其他属性一样,并将其添加到您的 init 方法中 好的,我试试看。 虽然有一个非常好的和可接受的答案,但请注意,要实际加载 cmets,您必须知道它们属于哪个帖子,这意味着您自然会知道父级的 postId邮政。当您撰写评论时,问题中的代码说明了这一点,Database.database().reference().child("comments").child(postId) 您知道 postId。同样,当您阅读它们时,您会知道 postId。 【参考方案1】:

一种选择是将 postId 设置为 Comment 结构中的属性并将其添加到 init 方法中,这样您将始终可以访问它

struct Comment 
    let postId: String
    var commentId: String!
    let user: User
    var creationDate: Date!
    let text: String
    let uid: String!

init(commentId: String!,user: User, postIdentifier: String, dictionary: [String: Any]) 
    self.commentId = commentId
    self.user = user
    self.postId = postIdentifier
    ...

【讨论】:

以上是关于如何检索评论/帖子的键的主要内容,如果未能解决你的问题,请参考以下文章

如何在某些帖子的评论中选择所有用户 ID?

Django ORM:在不执行 N+1 查询的情况下检索帖子和最新评论

如何从包含所有喜欢和评论的页面中获取所有帖子?

获取公开 Facebook 帖子的所有评论

从 Reddit 的 API 中检索评论

如何在不为每个帖子调用评论对象的情况下从墙上的帖子中获取评论计数?