Это пример изображения для объяснения проблемы в моем проекте.
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, но мое табличное представление не обновляется, я не могу видеть новые сообщения, которые я отправил в обоих контроллерах представления. (По моему мнению, это потому, что я не получаю никаких обновленных снимков документов, т.е. слушатель не работает).
любая помощь по поводу этого поведения !! Я искал, но ничего полезного не нашел.