JSQMessages ViewController чат без создания дочернего элемента в базе данных

Я использовал JSQMessagesViewController в моем Viewcontroller, Чат открывается с анонимным пользователем. Чат работает нормально, но мне нужно внести изменения в базу данных. Так как база данных является базой для этого. Я создаю дочерний элемент в своей базе данных, когда любое сообщение попадает в отображаемую базу данных, сначала в нем отображается дочерний элемент с именем "Сообщение", а под сообщением отображаются все сообщения чата. Я хочу удалить этого дочернего элемента, чат напрямую должен отображаться, когда он входит в базу данных, а также должен получать все сообщения напрямую, без вмешательства какого-либо ребенка в базу данных. Мой код это для чата,

import UIKit
import Firebase

import FirebaseDatabase

@objc class ChatViewViewController: JSQMessagesViewController, UINavigationControllerDelegate{

 var ref: DatabaseReference!
var Name : String?


 private var messages = [JSQMessage]()
lazy var messageRef = Database.database().reference().child("Message")
 var newMessageRefHandle: DatabaseHandle?
lazy var outgoingBubbleImageView: JSQMessagesBubbleImage = self.setupOutgoingBubble()
lazy var incomingBubbleImageView: JSQMessagesBubbleImage = self.setupIncomingBubble()
 private var updatedMessageRefHandle: DatabaseHandle?
override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "Chat Room"
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))

    self.ref = Database.database().reference(fromURL: "Database URL")

    guard let str = UserDefaults.standard.string(forKey: "name") else {
        return
    }
    senderDisplayName = str

    self.senderId = Auth.auth().currentUser?.uid as NSString?! as String!

    collectionView!.collectionViewLayout.incomingAvatarViewSize = CGSize.zero
    collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero

    observeMessages()
    // Do any additional setup after loading the view.

}

Отправить код кнопки это,

 override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) {
    let itemRef = messageRef.childByAutoId()
    let messageItem = [
        "senderId": senderId!,
        "senderName": senderDisplayName!,
        "text": text!,
        ]

    itemRef.setValue(messageItem)

    JSQSystemSoundPlayer.jsq_playMessageSentSound()

    collectionView.reloadData()

    finishSendingMessage()


}

Для отображения сообщений в пользовательском интерфейсе это,

 private func observeMessages() {
    //messageRef = channelRef!.child("messages")


    // 1.
    let messageQuery = messageRef.queryLimited(toLast:25)

    // 2. We can use the observe method to listen for new
    // messages being written to the Firebase DB
    newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) -> Void in
        // 3
        let messageData = snapshot.value as! Dictionary<String, String>

        if let id = messageData["senderId"] as String!, let name = messageData["senderName"] as String!, let text = messageData["text"] as String!, text.characters.count > 0 {
            // 4
            self.addMessage(withId: id, name: name, text: text)

            // 5
            self.finishReceivingMessage()

                }

    })

    updatedMessageRefHandle = messageRef.observe(.childChanged, with: { (snapshot) in
                          })
}

Вот так выглядит моя база данных

1 ответ

Я не знаю, полностью ли я понимаю, в чем ваша проблема, но из того, что я могу собрать, вы пытаетесь удалить Message слой из вашей базы данных. Вы должны быть в состоянии сделать это, изменив эту строку в верхней части вашего файла

lazy var messageRef = Database.database().reference().child("Message") к -> lazy var messageRef = Database.database().reference()

это удалит этот слой. Дайте мне знать, если это не та проблема, которую вы описываете.

Другие вопросы по тегам