[英]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,標簽將停止更新。 好像我的觀察者被移除了。 有沒有人有任何想法為什么我的觀察員在每個單元格停止工作? 另外,如果有人建議更好地解決這個問題,我感興趣嗎? 我擔心為每個單元創建一個觀察者可能是一個糟糕的解決方案。
今天早上醒來並意識到我的問題......在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.