You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:55