我正在尝试为我的开源社交媒体应用程序添加评论部分。我有一张桌子。当您单击此表中的帖子时,它将带您到MainViewController,在这里您可以阅读这些帖子的评论并发表您自己的评论。 Post类如下:
import Foundation
class Post {
var id:String
var title: String
var text:String
var createdAt:Date
var comment: [String] = []
init(id: String, title: String,text:String, timestamp:Double, comment: [String] = []) {
self.id = id
self.title = title
self.text = text
self.createdAt = Date(timeIntervalSince1970: timestamp / 1000)
}
static func parse(_ key:String, data:[String:Any]) -> Post? {
if let title = data["text"] as? String,
let text = data["title"] as? String,
let timestamp = data["timestamp"] as? Double {
return Post(id: key, title: title, text: text, timestamp:timestamp, comment: [])
}
return nil
}
}
MainTextViewController具有以下代码:
import Foundation
import UIKit
import Firebase
class MainTextView: UIViewController, UITextViewDelegate{
@IBOutlet weak var titleText: UILabel!
@IBOutlet weak var mainText: UILabel!
@IBOutlet weak var commentsTable: UITableView!
@IBOutlet weak var commentPlaceHolder: UILabel!
@IBOutlet weak var newCommentLabel: UITextView!
weak var delegate:NewPostVCDelegate?
@IBAction func reply(_ sender: UIButton) {
// Firebase code here
let postRef = Database.database().reference().child("posts").childByAutoId()
let postObject = [
"comment": newCommentLabel.text,
"timestamp": [".sv": "timestamp"]
] as [String : Any]
postRef.setValue(postObject, withCompletionBlock: { error, ref in
if error == nil {
self.delegate!.didUploadPost(withID: ref.key!)
self.dismiss(animated: true, completion: nil)
} else {
// Handle error
}
})
newCommentLabel.text = String()
commentPlaceHolder.isHidden = false
}
var post: Post?
// MARK: - View Controller LifeCycle
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setMain()
}
override func viewDidLoad() {
super.viewDidLoad()
print(delegate!)
commentsTable.dataSource = post?.comment as? UITableViewDataSource
newCommentLabel.delegate = self
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return post!.comment.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let label = UILabel(frame: CGRect(x:0, y:0, width:200, height:50))
cell.addSubview(label)
return cell
}
// UITableViewDelegate Functions
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 50
}
private func setMain() {
guard let post = self.post else {
return
}
titleText.text = post.text
mainText.text = post.title
}
func textViewDidChange(_ commentView: UITextView) {
commentPlaceHolder.isHidden = !newCommentLabel.text.isEmpty
}
}
这是我的数据库结构:
{
"posts" : {
"-LhaxLOSY3UI7tDUrCA_" : {
"text" : "Nelson",
"timestamp" : 1560800488059,
"title" : "Hey\t"
},
"-LhaxbnjgDP7tdb7Eq_4" : {
"text" : "Lol",
"timestamp" : 1560800558514,
"title" : "How’s it going"
},
"comment" : {
"comment" : "Howdy"
}
}
}
我希望在发表评论时,它会为帖子的评论数组添加新的评论。然后,每个人都可以在commentsTable中看到注释,这些注释是数组中字符串的集合,其中最老的一个在顶部。
目前,创建新评论将在Firebase中发布新帖子,其中仅将评论作为单个字符串和时间戳记。您将如何解决此问题,以便发布按钮可以将表格附加到表中,并且commentTable可以显示数组中的字符串?让我知道是否需要我发布更多详细信息。谢谢您的帮助。
答案 0 :(得分:1)
从概念上讲,如果您不想要过多的代码,那么如果您想拥有一系列的帖子,然后每个帖子可以另外添加注释,这是结构的一个选择。
posts
post_id_0
text: "some text"
timestamp: "20190601"
title: "post title"
post_uid: "uid_0"
comments
comment_id_0
belongs_to_post: "post_id_0"
comment: "a comment about the post"
timestamp: "20190601"
comment_uid: "uid_49"
comment_id_1
belongs_to_post: "post_id_0"
comment: "check out that first post!"
timestamp: "20190602"
comment_uid: "uid_102"
users
uid_0
name: "Leroy"
然后将观察者附加到帖子和评论中。发布新帖子时,您会收到关于该帖子的通知,可以将其添加到tableView数据源并刷新tableView。
添加新评论后,系统将通知您该评论并将其添加到评论数据源并重新加载评论tableView。要添加新帖子:
let thisPostRef = your_firebase.posts.childByAutoId()
thisPostRef.setValue(your_post_data)
并添加评论
let postKey = the_post.key
let commentRef = your_firebase.comments.childByAutoId()
commentRef.setValue(your_comment_data)
并且your_comment_data将包含一个子节点'belongs_to_post:postKey'
您还可以监视某些用户发表的某些帖子的评论,甚至可以按日期或日期范围查询评论。
在代码方面,发布和评论节点都是使用.childByAutoId创建的-最佳做法是将节点键与其所包含的数据解除关联,除非它是像uid这样的静态数据。
如果您想增加灵活性,可以在其相关注释的每个帖子中保留一个子节点。
posts
post_id_0
text: "some text"
timestamp: "20190601"
title: "post title"
post_uid: "uid_0"
comments:
comment_id_0: true
comment_id_1: true
但这取决于您要运行哪种查询。
注意:我将注释结构与posts节点分离,因为在运行查询时对数据进行非规范化非常有益。