如何检索评论/帖子的键
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
...
【讨论】:
以上是关于如何检索评论/帖子的键的主要内容,如果未能解决你的问题,请参考以下文章