我有一个奇怪的情况,我可以使用一些帮助。
在应用程序中,用户列出了典型tableView
中列出的要执行的任务。当用户点击单元格时,表格会以复选标记进行更新,并将数据发送到Firebase。这一切都运作良好。
问题是用户从右侧滑动并移除项目的复选标记(从而将单元格重置为“空白”)。复选标记消失,本地阵列更新,Firebase应删除该值。如果用户只对一个单元格执行此操作,则可以正常工作。但是,如果用户一个接一个地重置多个单元格,Firebase就无法“跟上”,只有部分数据从Firebase中删除。
但是,如果用户缓慢移动并删除每个项目,例如,在滑动之间暂停3秒,Firebase会保持并正确删除项目。
这怎么可能?我已经阅读了Firebase文档,我找不到它说你必须慢慢删除项目,否则它将无法正常工作。我一定错过了什么。
以下是相关代码:
for (pointsIndex, pointsItem) in Points.pointsArray.enumerated() {
// isolate item in Points array (current user, current category, current item name, and current date)
if pointsItem.user == self.currentUserName &&
pointsItem.itemCategory == category &&
pointsItem.itemName == isoArrayForItem.first?.itemName &&
Calendar.current.isDate(Date(timeIntervalSince1970: pointsItem.itemDate), inSameDayAs: selectedDate) {
// remove item from points array
Points.pointsArray.remove(at: pointsIndex)
// update Firebase points
// NOTE: since user can only tap on one item at a time when creating the item, there technically should be only one item for that user at that precise moment for us to delete
// That's why we query the itemDate
ref.child("points").child(self.currentUserName).queryOrdered(byChild: "itemDate").queryEqual(toValue: pointsItem.itemDate).observeSingleEvent(of: .childAdded, with: { (snapshot) in
snapshot.ref.removeValue()
})
// update user's income array & income label
if let index = Income.currentIncomeArray.index(where: { $0.user == currentUserName }) {
Income.currentIncomeArray[index].currentPoints -= pointsItem.valuePerTap
Income.progressMeter -= CGFloat(pointsItem.valuePerTap)
if category == "daily habits" { habitProgressMeter -= CGFloat(pointsItem.valuePerTap) }
updateUserIncomeOnFirebase(user: currentUserName, index: index)
incomeLabel.text = Points.formatMoney(value: Double(Income.currentIncomeArray[index].currentPoints) / 100, showCents: true, roundIfMoreThan10: false, showDollarSign: true)
updateProgressMeters(animated: true, duration: 0.25)
}
updateWeeklyJobsArray()
tableView.setEditing(false, animated: true)
tableView.reloadRows(at: [indexPath], with: .none)
}
}
updateUserIncomeOnFirebase
方法总是会触发。但这是因为它与解决方案有一些关联:
func updateUserIncomeOnFirebase(user: String, index: Int) {
ref.child("mpIncome").updateChildValues([user : Income.currentIncomeArray[index].currentPoints])
}