ios - 在另一个选项卡中加载相同的 View Controller 时,文档快照监听器不起作用! - swift

标签 ios swift firebase google-cloud-firestore

这是用于解释我的项目中的问题的示例图片。
enter image description here
我在这里有一个选项卡式 View Controller ,在一个选项卡中我有 指南简介列表 ,在其他标签中我有 聊天列表我已经做好了。
有一个chatScreenViewController..(像这样的示例图片)
enter image description here
这个单一的聊天 View Controller 以两种方式加载,
(1) 当我从聊天选项卡中的对话列表中单击任何对话时。
(2) 在引导配置文件屏幕中有一个 聊天 按钮,当我单击那个实例化 singleChatViewController 并加载到导航堆栈中的聊天按钮时。
每当加载此 View Controller 时,都会调用此函数,即此函数将监听器添加到 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()
                }
            }
        }
    }
}
如果我在一个选项卡中打开一个聊天,它可以正常工作,发送和接收消息并且表格 View 正确加载。
但是,当我也通过单击同一指南配置文件中的聊天按钮在其他选项卡中加载此 View Controller 时,该指南配置文件中的单个聊天已加载到其他选项卡中,问题就出现了。
现在,当我发送消息时,数据已正确存储到 firebase 文档但我的 TableView 未更新,我看不到我在两个 View Controller 中发送的新消息。 (这在我看来非常重要,因为我没有收到任何更新的文档快照,即监听器不工作)。
关于这种行为的任何帮助!我搜索了但我找不到任何有用的东西。

最佳答案

您可以通过 super 全局变量检查事件 View Controller ,如果设置了该变量,则无需再次加载该 View Controller ,而是使已加载聊天 View Controller 的选项卡处于事件状态。不是永久解决方案,但我认为这可能有效!

关于ios - 在另一个选项卡中加载相同的 View Controller 时,文档快照监听器不起作用! - swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62894680/

相关文章:

swift - 如何隐藏移动键盘的上栏?

swift - 自定义 SDCAlertView

firebase - 没有 google-services.json 文件的 Google 登录

android - 添加 ML Kit 后无法解析 : com. google.android.gms :play-services:15. 0.1

ios - NSDate 不是 Objective-C 对象?

ios - 构建这样的 iOS 应用程序有多难?

ios - 更改查看垃圾邮件警告 - iOS

ios - fatal error : unexpectedly found nil while unwrapping an Optional value in AVFoundation

swift - Xcode 11 beta 5 中止陷阱 : 6 error when calling sink on @Published variable

swift - 我如何修复在 View 不在窗口层次结构中的 ViewController 上呈现 UIAlertController 的尝试