Сообщения чата не загружаются должным образом

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

Сообщения чата не загружаются должным образом

Кто-нибудь может помочь? Кроме того, иногда, когда создается новый пользователь, и он общается с другим пользователем, сообщения от другого пользователя не отражаются в чате нового пользователя.

override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            navigationItem.title = "Chat"
            DispatchQueue.global(qos:.userInteractive).async {
                DispatchQueue.main.async {
                    self.loadPosts()
                    self.loadPostsReceivedMessage()
                }
            }
        }

    //Get Message sent
       func loadPosts() {
            let senderIDNumber = Auth.auth().currentUser?.uid
            let chatsRef = db.collection("chats").order(by: "timestamp", descending: false)
            chatsRef.whereField("senderID", isEqualTo: senderIDNumber!).whereField("receiverID", isEqualTo: receiverIDNumber)
                .addSnapshotListener { querySnapshot, error in
                    guard let documents = querySnapshot?.documents else {
                        print("Error fetching documents: \(error!)")
                        return
                    }
                    for document in documents {
                        let messageText = document.data()["message"] as? String
                        let senderIDNumber = document.data()["senderID"] as? String
                        let receiverIDNumber = document.data()["receiverID"] as? String
                        let timestamp = document.data()["timestamp"] as? String
                        guard let sender = document.data()["sender"] as? String else {return}
                       // let conversationsCounter = document.data()["conversationsCounter"] as? Int
                        guard let profileUrl = document.data()["profileUrl"] as? String else { return}
                        let chat = Chat(messageTextString: messageText!, senderIDNumber: senderIDNumber!, receiverIDNumber: receiverIDNumber!, timeStampString: timestamp!, profileImageUrl: profileUrl, senderString: sender)
        self.chats.append(chat)
        print(self.chats)
        self.collectionView.reloadData()
        }
        }
        }


        //Get message received
        func loadPostsReceivedMessage() {
           /* let uid = Auth.auth().currentUser?.uid
            let ref = Database.database().reference()
            ref.child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
                if let dic = snapshot.value as? [String: AnyObject]{
                    let currentUser = dic["username"] as? String
                    let senderIDNumber = Auth.auth().currentUser?.uid
                } */
                    let chatsRef = db.collection("chats").order(by: "timestamp", descending: false)
                    print("thecurrentreceiver"+senderString)
                    print("thecurrentsender"+receiverIDNumber)
            chatsRef.whereField("receiverID", isEqualTo: senderString).whereField("sender", isEqualTo: receiverIDNumber)
                        .addSnapshotListener { querySnapshot, error in
                            guard let documents = querySnapshot?.documents else {
                                print("Error fetching documents: \(error!)")
                                return
                            }
                            for document in documents {
                                let messageText = document.data()["message"] as? String
                                let senderIDNumber = document.data()["senderID"] as? String
                                let receiverIDNumber = document.data()["receiverID"] as? String
                                let timestamp = document.data()["timestamp"] as? String
                                // let conversationsCounter = document.data()["conversationsCounter"] as? Int
                                guard let profileUrl = document.data()["profileUrl"] as? String else { return}
                                guard let sender = document.data()["sender"] as? String else {return}
                                let chat = Chat(messageTextString: messageText!, senderIDNumber: senderIDNumber!, receiverIDNumber: receiverIDNumber!, timeStampString: timestamp!,profileImageUrl: profileUrl, senderString: sender)
                                print("whatisthemessage"+messageText!)
                                self.chats.append(chat)
                                print(self.chats)
                                self.chats.sort{$0.timestamp < $1.timestamp}
                                self.collectionView.reloadData()
                            }
                    }
        }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
68
1

Ответы 1

Вы используете addSnapshotListener, а это означает, что ваш обратный вызов вызывается каждый раз, когда что-то важное в базе данных изменяется. И когда это происходит, вы перебираете все документы, соответствующие вашему запросу, и добавляете их в свое представление. Это означает, что при нескольких изменениях вы добавляете большинство сообщений несколько раз.

Есть два распространенных решения:

  1. Очищайте представление каждый раз, когда вызывается ваш обратный вызов.
  2. Изменяйте представление только для изменений каждый раз, когда вызывается ваш обратный вызов.

Мы будем использовать № 2 ниже, так как он более эффективен. Обратите внимание, что я обрабатываю новые сообщения только для простоты. По мере того, как вы делаете свое приложение более полным, вам также потребуется обрабатывать другие типы изменений, например когда пользователь удаляет или обновляет сообщение чата.

let chatsRef = db.collection ("chats").order (by: "timestamp", descending: false)
chatsRef.whereField ("senderID", isEqualTo: senderIDNumber!)
  .whereField ("receiverID", isEqualTo: receiverIDNumber)
  .addSnapshotListener {
    querySnapshot,
    error in guard let documentChanges = querySnapshot?.documentChanges else {
        print ("Error fetching documents: \(error!)")
        return
    }
    for documentChange in documentChanges {
      if (documentChange.type == .added) {
        let data = documentChange.document.data ()
        let messageText = data["message"] as? String
        let senderIDNumber = data["senderID"] as? String
        let receiverIDNumber = data["receiverID"] as? String
        let timestamp = data["timestamp"] as? String
        ...

        let chat = Chat (
            messageTextString : messageText!,
            senderIDNumber : senderIDNumber!,
            receiverIDNumber : receiverIDNumber!,
            timeStampString : timestamp!,
            profileImageUrl : profileUrl,
            senderString : sender
        )
        self.chats.append (chat)
        print (self.chats)
        self.collectionView.reloadData ()
    }
  }
}

Чтобы узнать больше об этом, посмотрите реагируя на изменения в документации Firebase.

Я все еще получаю ту же ошибку, несмотря на попытку вашего кода.

Lionel Tan 04.07.2018 16:40

Когда я выхожу из чата и снова вхожу в чат, все выглядит нормально. Просто когда я нажимаю кнопку отправки, некоторые сообщения дублируются. При первой загрузке чата старые сообщения тоже выглядят нормально. @IBAction func sendTextMessage (_ sender: Any) {chats.removeAll () self.sendDataToDatabase (message: messageText.text!) MessageText.text = nil self.loadPosts () self.loadPostsReceivedMessage () delayCompletionHandler {self.colatalection () delayCompletionHandler {self.colatalection )}}

Lionel Tan 04.07.2018 17:50

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