每个tableViewCell中的Firebase数据库观察者

时间:2018-02-20 03:38:23

标签: ios swift firebase firebase-realtime-database

我正在创建一个聊天应用程序,其中主视图是一个tableView,每行代表一个聊天。该行具有该人名的标签以及带有最新聊天消息的标签。如果用户点击一行,它将进入聊天视图。我正在使用MessageKit作为聊天框架。一切都运作良好,除了我无法始终显示最近的聊天。

以下是我的tableView的外观。请忽略黑圈,我很快就清理出我用来测试的个人照片。

enter image description here

我有一个自定义tableViewCell,方法如下。这会从最近的消息开始为此特定聊天创建一个观察者。

.

在观察此用户的chatID后,我在TableView的方法cellForRowAt中调用此函数。

  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
      }
    }
  }

理想情况下,这应该为每个聊天创建一个观察者,并在每次发送新消息时更新标签。我遇到的问题是它有时有效,但其他时间似乎停止观察。

例如,如果我在聊天tableView上并获取其中一个单元格的新消息,则会更新。但是,如果我然后点击该聊天以进入特定聊天并发送消息,然后点击后退按钮返回到我的tableView,标签将停止更新。好像我的观察者被移除了。有没有人有任何想法为什么我的观察员在每个单元格停止工作?另外,如果有人建议更好地解决这个问题,我感兴趣吗?我担心为每个细胞创建一个观察者可能是一个糟糕的解决方案。

编辑:我发现观察者在选择后退按钮后停止工作,或者从下面屏幕截图中的聊天中向后滑动到tableView。 Chat

1 个答案:

答案 0 :(得分:1)

今天早上醒来并意识到我的问题......在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)
    }
  }