我正在创建一个聊天应用程序,其中主视图是一个tableView,每行代表一个聊天。该行具有该人的名字的标签以及带有最新聊天消息的标签。如果用户点击一行,它将进入聊天视图。我将MessageKit用于聊天框架。一切工作正常,但我无法始终显示最新的聊天记录。

这是我的tableView的外观。请忽略黑色圆圈,我很快就清除了用于测试的个人照片。

ios - 每个tableViewCell中的Firebase数据库观察器-LMLPHP

我有以下方法的自定义tableViewCell。这将从最近的消息开始为该特定聊天创建观察者。

  func getLatestChatMessage(with chatID: String) {
    guard let loggedInUserID = Auth.auth().currentUser?.uid else { return }
    DatabaseService.shared.chatsRef.child(chatID).queryLimited(toLast: 1).observe(.childAdded) { [weak self] (snapshot) in

      guard let messageDict = snapshot.value as? [String:Any] else { return }
      guard let chatText = messageDict["text"] as? String else { return }
      guard let senderId = messageDict["senderId"] as? String else { return }

      DispatchQueue.main.async {
        if senderId == loggedInUserID {
          self?.latestChatMessage.textColor = .black
        } else {
          self?.latestChatMessage.textColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1)
        }
        self?.latestChatMessage.text = chatText
      }
    }
  }

在观察该用户的chatID之后,我在TableView的方法cellForRowAt中调用此函数。
  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

     DatabaseService.shared.matchedChatIdRef.child(loggedInUserID).child(match.matchedUserId).observeSingleEvent(of: .value) { (snapshot) in
            if let chatID = snapshot.value as? String {
              cell.getLatestChatMessage(with: chatID)
            }
          }
      }

理想情况下,这应该为每次聊天创建一个观察者,并在每次发送新消息时更新标签。我遇到的问题是,有时它可以正常工作,但其他时候似乎无法观察到。

例如,如果我在chat tableView上并收到其中一个单元格的新消息,它将更新。但是,如果我随后点击该聊天以转入特定的聊天并发送消息,然后点击“后退”按钮返回到我的tableView,则标签将停止更新。看来我的观察者已被移走。有谁知道为什么每个单元中的观察者停止工作?另外,我是否有任何人对更好的解决方案有建议?我担心为每个单元创建观察者可能是一个糟糕的解决方案。

编辑:我发现观察者在选择后退按钮或从下面的屏幕快照中的聊天轻扫回到tableView后停止工作。
ios - 每个tableViewCell中的Firebase数据库观察器-LMLPHP

最佳答案

今天早上醒来,意识到我的问题...在ChatViewController中,我正在调用removeAllObservers()

我将代码更新为以下内容,只是删除了聊天中的观察者,从而解决了我的问题:

  override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(true)

    if let observerHandle = observerHandle, let chatID = chatId {
      DatabaseService.shared.chatsRef.child(chatID).removeObserver(withHandle: observerHandle)
    }
  }

关于ios - 每个tableViewCell中的Firebase数据库观察器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48877491/

10-08 22:26
查看更多