在帖子中添加数组而不是创建新帖子

时间:2019-06-17 17:44:04

标签: ios swift firebase firebase-realtime-database

我正在尝试为我的开源社交媒体应用程序添加评论部分。我有一张桌子。当您单击此表中的帖子时,它将带您到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可以显示数组中的字符串?让我知道是否需要我发布更多详细信息。谢谢您的帮助。

1 个答案:

答案 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节点分离,因为在运行查询时对数据进行非规范化非常有益。