Firebase无法跟上用户删除的步伐,但有时只是?

时间:2018-02-07 01:18:01

标签: swift firebase firebase-realtime-database

我有一个奇怪的情况,我可以使用一些帮助。

在应用程序中,用户列出了典型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])
}

0 个答案:

没有答案