Прослушиватель моментальных снимков документа не работает, если тот же контроллер представления загружен в другую вкладку! - Свифт - PullRequest
1 голос
/ 14 июля 2020

Это пример изображения для объяснения проблемы в моем проекте.

enter image description here

I have a tabbed view controller here, in one tab i have Guide Profile List, in other tab i have List of Chats i have done.

There is a single chatScreenViewController.. (example picture like this)

введите описание изображения здесь

этот единственный контроллер представления чата загружается двумя способами: (1) когда я щелкаю любой разговор из списка разговоров на вкладке чатов. (2) На экране профиля гида есть кнопка Chat , когда я нажимаю эту кнопку чата, которая создает экземпляр singleChatViewController и загружается в стек навигации.

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

func loadUpChatModel()
{
    guard let chateeInfo = self.chateeInfoStruct
    else
    {
        print("chateeInfoStruct from previous vc is not set")
        return
    }
    
    let chatId = chateeInfo.chatId
    setTouristReadValueToTrue(chatId: chatId)
    
    let chatRef = Firestore.firestore().collection("chats").document(chatId)
    self.listner = chatRef.addSnapshotListener
    { (chatDocument, error) in
        if let err = error
        {
            print(err.localizedDescription)
            print("error getting a chat document")
        }
        else
        {
            if chatDocument != nil, chatDocument!.exists
            {
                guard let data = chatDocument!.data()
                else
                {
                    print("unable to convert data of single chat for chat list model")
                    return
                }
        
                if let model = self.chatModel
                {
                    let oldTotalMessages = model.totalMessages!
                    let newTotalMessages = data["totalMessages"] as! Int
                    let messagesAdded = newTotalMessages - oldTotalMessages
                    var i = 0
                    while i < messagesAdded
                    {
                        let message = data["message\(oldTotalMessages+i+1)"] as? String ?? "Unable to retrieve"
                        let messageSentStatus = data["message\(oldTotalMessages+i+1)sent"] as? Bool ?? false
                        let block = messageBlock(message: message, messageWasSent: messageSentStatus)
                        self.chatModel!.messagesArray.append(block)
                        i += 1
                    }
                    self.chatModel!.lastMessageDate = data["lastMessageDate"] as? String ?? "date not found for this chat"
                    self.chatModel!.totalMessages = newTotalMessages
                    self.updateTableView()
                }
                else
                {
                    let lastMessageDate = data["lastMessageDate"] as? String ?? "date not found for this chat"
                    let totalMessages = data["totalMessages"] as? Int ?? 0
                    let singleChatModel = SingleChatDM(chatId: chatId, lastMessageDate: lastMessageDate, totalMessages: totalMessages)
                    var i = 0
                    while i < totalMessages
                    {
                        let message = data["message\(i+1)"] as? String ?? "Unable to retrieve"
                        let messageSentStatus = data["message\(i+1)sent"] as? Bool ?? false
                        let block = messageBlock(message: message, messageWasSent: messageSentStatus)
                        singleChatModel.messagesArray.append(block)
                        i += 1
                    }
                    self.chatModel = singleChatModel
                    self.updateTableView()
                }
            }
        }
    }
}

Если я открываю отдельный чат на одной вкладке, он работает нормально, сообщения отправляются и принимаются, а таблица загружается правильно. НО, когда я загружаю этот контроллер представления в другую вкладку, также нажимая кнопку чата из того же профиля руководства, чей единственный чат загружен на другой вкладке, возникает проблема. Теперь, когда я отправляю сообщение, данные правильно сохраняются в документе firebase, но мое табличное представление не обновляется, я не могу видеть новые сообщения, которые я отправил в обоих контроллерах представления. (По моему мнению, это потому, что я не получаю никаких обновленных снимков документов, т.е. слушатель не работает).

любая помощь по поводу этого поведения !! Я искал, но ничего полезного не нашел.

1 Ответ

1 голос
/ 20 июля 2020

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

...