如何检索评论/帖子的键

时间:2019-10-06 02:32:43

标签: ios swift firebase firebase-realtime-database

我很难同时尝试获取postId和commentId。

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

这里是Comment Struct,下面是应该删除用户评论的函数,但是由于某种原因,我只能返回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()




    }

这是注释的获取方式



    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()
        }

        }

Json通过Firebase进行评论

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

1 个答案:

答案 0 :(得分:2)

一种选择是使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
    ...