ios - uitableview 单元格第一次仍然无法正确删除
问题描述
所以我的目标是能够一次性删除表格视图单元格,而不必担心尝试删除两次。我有一种从 tableview 中删除单元格的方法,此外还从 Algolia 索引中删除了一条记录,并从 Firestore 集合中删除了一个文档。
这是那个方法:
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { (deleted, view, completion) in
let alert = UIAlertController(title: "Delete Event", message: "Are you sure you want to delete this event?", preferredStyle: .alert)
let deleteEvent = UIAlertAction(title: "Delete", style: .destructive) { (deletion) in
guard let user = Auth.auth().currentUser else { return }
let documentid = self.documentsID[indexPath.row].docID
let algoliaID = self.algoliaObjectID[indexPath.row].algoliaObjectID
let deleteIndex = client.index(withName: IndexName(rawValue: user.uid))
self.getTheSchoolsID { (id) in
guard let id = id else { return }
self.db.collection("student_users").whereField("school_id", isEqualTo: id).getDocuments { (querySnapshot, error) in
guard error == nil else {
print("Couldn't fetch the student users.")
return
}
let group = DispatchGroup()
for document in querySnapshot!.documents {
group.enter()
let userUUID = document.documentID
self.db.collection("student_users/\(userUUID)/events_bought").whereField("eventID", isEqualTo: documentid).getDocuments { (querySnapshotTwo, error) in
guard error == nil else {
print("Couldn't fetch if student users are purchasing this event")
return
}
guard querySnapshotTwo?.isEmpty == true else {
self.showAlert(title: "Students Have Purchased This Event", message: "This event cannot be deleted until all students who have purchased this event have completely refunded their purchase of this event. Please be sure to make an announcement that this event will be deleted.")
return
}
group.leave()
}
}
group.notify(queue: .main) {
deleteIndex.deleteObject(withID: ObjectID(rawValue: algoliaID)) { (result) in
if case .success(let response) = result {
print("Algolia document successfully deleted: \(response.wrapped)")
}
}
self.db.document("school_users/\(user.uid)/events/\(documentid)").delete { (error) in
guard error == nil else {
print("There was an error deleting the document.")
return
}
print("Deleted")
}
self.eventName.remove(at: indexPath.row)
tableView.reloadData()
}
}
}
}
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
alert.addAction(deleteEvent)
self.present(alert, animated: true, completion: nil)
}
deleteAction.backgroundColor = UIColor.systemRed
let config = UISwipeActionsConfiguration(actions: [deleteAction])
config.performsFirstActionWithFullSwipe = false
return config
}
非常简单,我最近添加了DispatchGroup
块来修复一些 UI 问题以及 Firestore 查询,但除此之外,它只是group.notify()
之前的内容。
现在由于某种原因,当我尝试删除单元格时,它会删除并显示打印消息,就好像它已成功删除一样,但是当我在放置在视图控制器中的搜索栏中搜索时,我仍然可以看到单元格搜索结果。这基本上意味着不仅没有从 Algolia 中删除记录,而且来自 Firestore 的文档也没有被删除。是的,删除后单元格已从 tableview 中删除,但只要我搜索并点击它,它就会实例化视图控制器并显示 Firestore 文档中的所有字段。一旦我敲出该视图控制器,该单元格就会重新出现在表格视图中,并要求我再次删除它以使其实际工作。
所以问题是,使用我提供的功能,如何确保第一次正确删除单元格?
解决方案
根据@dante 评论,描述中的方法现在有效,但是:
目前,上面的代码在这些功能中的任何一个完成之前重新加载表视图。
正如@jnpdx 提到的,正确的方法是在重新加载表视图之前等待删除结束,因为
deleteIndex.deleteObject
和document(...).delete
都是异步函数。
推荐阅读
- solid-principles - SOLID - SRP,一份工作或改变的一个原因
- javascript - 在 vue.js 中为每个循环使用计算数据
- python - 是否可以使用同一模型中的其他字段数据制作 django 管理字段过滤器?
- python - pyinstaller - 冻结应用程序时 QtWebEngineWidgets 抛出 dll 错误
- ios - 标签隐藏很慢
- c# - 我只看到项目模板 blazorserver,为什么我没有看到项目模板 blazor、blazorhosted、blazorlib、blazorserverside?
- python - 在 Open cv 中为彩色图像应用蒙版
- pandas - 处理 Excel 数据时选择 pandas 而不是 xlsxwriter
- opencv - 将 Harcascading 文件与您自己的训练有素的 SVM 文件一起使用
- c - “向存档文件添加索引”是什么意思?