簡體   English   中英

每個tableViewCell中的Firebase數據庫觀察者

[英]Firebase database observer in each tableViewCell

我正在創建一個聊天應用程序,其中主視圖是一個tableView,每行代表一個聊天。 該行具有該人名的標簽以及帶有最新聊天消息的標簽。 如果用戶點擊一行,它將進入聊天視圖。 我正在使用MessageKit作為聊天框架。 一切都運作良好,除了我無法始終顯示最近的聊天。

這是我的tableView的外觀。 請忽略黑圈,我正在快速清理我用於測試的個人照片。

在此輸入圖像描述

我有一個自定義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)
            }
          }
      }

理想情況下,這應該為每個聊天創建一個觀察者,並在每次發送新消息時更新標簽。 我遇到的問題是它有時有效,但其他時間似乎停止觀察。

例如,如果我在聊天tableView上並為其中一個單元格獲取新消息,則會更新。 但是,如果我然后點擊該聊天以進入特定聊天並發送消息,然后點擊后退按鈕返回到我的tableView,標簽將停止更新。 好像我的觀察者被移除了。 有沒有人有任何想法為什么我的觀察員在每個單元格停止工作? 另外,如果有人建議更好地解決這個問題,我感興趣嗎? 我擔心為每個單元創建一個觀察者可能是一個糟糕的解決方案。

編輯:我發現觀察者在選擇后退按鈕后停止工作,或者從下面的屏幕截圖中的聊天中刷回tableView。 聊

今天早上醒來並意識到我的問題......在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)
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM