Firestore求和异常:TableView滑动时累计值重复叠加问题求助
问题根源分析
- 变量未重置:
totalVotes作为类成员变量,每次触发Firestore请求时不会自动归零,滑动TableView导致cell复用、重复请求时,会在之前的总和基础上持续累加。 - 错误的赋值时机:在遍历文档的循环中直接给cell标签赋值,且请求逻辑放在cell配置流程(如
cellForRowAt)里,导致滑动时重复发起请求、重复累加。
修复方案
步骤1:重构数据获取与总和计算逻辑
将Firestore请求移至页面初始化阶段(如viewDidLoad),避免滑动时重复请求;计算总和前先重置累加变量,确保每次计算从0开始。
修正后代码示例
首先在类中定义存储总和的变量:
var totalQuantitySum: Double = 0.0
然后在页面初始化时获取数据并计算总和:
override func viewDidLoad() { super.viewDidLoad() // 其他初始化代码 fetchTotalQuantity() } func fetchTotalQuantity() { db.collection("Admin").document("AI智能機器人").collection("Ai日獲利") //.order(by: "date", descending: true) //.whereField("date", isGreaterThanOrEqualTo: dateStr) //.whereField("date", isLessThanOrEqualTo: date3) .getDocuments() { [weak self] (snapshot, error) in guard let self = self, let snapshot = snapshot, !snapshot.documents.isEmpty else { return } // 计算前重置总和为0 self.totalQuantitySum = 0.0 for document in snapshot.documents { if let quantity = document.data()["quantity"] as? Double { self.totalQuantitySum += quantity } } // 计算完成后刷新TableView,更新cell显示 self.tableView.reloadData() } }
步骤2:在cell配置方法中直接使用预计算的总和
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "你的Cell标识符", for: indexPath) as! 你的Cell类 // 直接用预计算好的总和设置标签 cell.nowq8.text = "+" + String(format: "%.4f", totalQuantitySum) + "%" return cell }
关键修复点
- 把数据请求从cell配置逻辑中剥离,避免滑动触发重复请求。
- 每次计算总和前重置累加变量,确保计算起点正确。
- 计算完成后刷新TableView,让所有cell同步显示正确的总和值。
内容的提问来源于stack exchange,提问作者lin lin
相关产品推荐
相关产品推荐

