Swift/Firebase 删除Firebase节点后TableView单元格未刷新求助
嗨,我来帮你排查这个TableView不更新的问题!核心原因其实是你只同步了Firebase的新增节点,但没处理删除事件,而且本地的eventsList数组也没和数据库的删除操作同步。咱们一步步来改:
1. 给Events类新增uid属性
每个Firebase节点都有唯一的key,咱们把这个key存到事件对象里,这样后面删除时能快速定位本地数组里对应的元素:
class Events: NSObject { // 保留你原有的所有属性 var uid: String? // 新增属性,存储Firebase节点的唯一key var location: String? var dateTime: String? var agencyEventSubtypeCode: String? var agencyId: String? var alarmLevel: String? var originatingAction: String? var agencyEventId: String? }
2. 监听Firebase的.childRemoved事件
你当前的fetchData()只监听了.childAdded(仅处理新增节点),但数据库节点被删除时会触发.childRemoved事件,咱们需要添加这个监听来同步本地数组:
func fetchData(){ // 保留原有监听新增节点的逻辑,记得把snapshot的key存入event refHandle = ref?.child("caddata").observe(.childAdded, with: { (snapshot) in if let dictionary = snapshot.value as? [String: Any] { let event = Events() event.setValuesForKeys(dictionary) event.uid = snapshot.key // 绑定节点key到事件对象 if event.originatingAction == "CadEventNew" { self.eventsList.append(event) DispatchQueue.main.async { self.myTableView.reloadData() } } } }) // 新增:监听节点删除事件 ref?.child("caddata").observe(.childRemoved, with: { (snapshot) in // 移除本地数组中对应uid的事件 self.eventsList.removeAll { $0.uid == snapshot.key } // 主线程刷新TableView DispatchQueue.main.async { self.myTableView.reloadData() } }) }
3. 优化删除逻辑,移除冗余操作
你当前deleteFromDB()里删除成功后调用了fetchData(),这会重复添加监听导致异常,直接删掉这行:
func deleteFromDB () { if closeUID != nil { print (cadEventNumber!) print (closeUID!) ref?.child("caddata").child(closeUID!).removeValue(completionBlock: { (error, ref) in if error != nil { // 移除这里的fetchData()调用! print("Error: \(String(describing: error))") return } }) } print ("\(String(describing: closeUID)) has been removed") }
为什么这样改能解决问题?
你之前的问题在于:删除Firebase节点后,本地eventsList数组还是旧内容,就算反复调用reloadData(),TableView也只会显示数组里的原有元素。现在通过监听.childRemoved事件,数据库节点删除时会同步移除本地数组的对应元素,再刷新TableView,UI就会和数据库状态保持一致了。
内容的提问来源于stack exchange,提问作者jvan
相关产品推荐
相关产品推荐

