Добавление массива в сообщение, а не создание нового сообщения - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь создать секцию комментариев для моего приложения для социальных сетей с открытым исходным кодом.У меня есть таблица сообщений.Когда вы щелкаете сообщение в этой таблице, оно переходит в 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, содержащий только комментарий в виде одной строки и отметку времени.Как бы вы исправили эту проблему, чтобы кнопка post добавляла таблицу, а commentsTable отображал строки из массива?Дайте мне знать, если вы хотите, чтобы я опубликовал более подробную информацию.Спасибо за помощь.

1 Ответ

1 голос
/ 17 июня 2019

Не вдаваясь в кучу кода, концептуально, если вы хотите иметь серию постов, и тогда у каждого поста могут быть дополнительные комментарии, вот один вариант для структуры.

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.

Когда добавляется новый комментарий, вы будете уведомлены об этом комментарии и добавите его в источник данных комментариев и перезагрузите таблицу комментариев. Чтобы добавить новый пост:

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 будет включать в себя дочерний узел 'own_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

но это зависит от того, какие запросы вы хотите запускать.

Примечание: я отделяю структуру комментариев от узла публикаций, поскольку денормализация ваших данных очень полезна при выполнении запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...