删除、添加或修改Firestore文档和分页结果后重新加载TableView



我正在从Firebase Firestore检索文档,并将它们显示在表视图中。从表视图中,我希望能够删除和添加项目。我还可以从项目详细信息视图中修改文档。不过,我会把重点放在删除这个问题的项目上。通过使用上一个快照只获取下一组项,我的查询得到了分页结果。我还使用了一个监听器来获得修改项目时的实时更新。删除的问题是如何正确处理?我目前所做的删除项目很好,但会将表视图中的其余行加倍。

var items = [Item]()
var itemQuery: Query?
var lastSnapshot: QueryDocumentSnapshot?
func getItems() {
if lastSnapshot == nil {
itemQuery = Firestore.firestore().collection("items").whereField("collection", isEqualTo: self.collection!.id).order(by: "name").limit(to: 25)
} else {
itemQuery = itemQuery?.start(afterDocument: lastSnapshot!)
}
itemQuery!.addSnapshotListener( { (snapshot, error) in
guard let snapshot = snapshot else {
return
}
if snapshot.documents.last != nil {
self.lastSnapshot = snapshot.documents.last
} else {
return
}
if let error = error {
print(error.localizedDescription)
} else {
for document in snapshot.documents {
let docName = document["name"] as? String
let docId = document.documentID
let docImages = document["images"] as? [String]
let docCollection = document["collection"] as? String
let docInfo = document["info"] as? String
let docQuantity = document["quantity"] as? Int
let item = Item(id: docId, name: docName!, collection: docCollection!, info: docInfo!, images: docImages!, quantity: docQuantity!)
self.items.append(item)
}
if self.items.count >= 25 {
self.addFooter()
}
self.tableView.reloadData()
}
})
}
func deleteItem(at indexPath: IndexPath) {
let itemToDelete = items[indexPath.row]
// Delete images from storage
for url in itemToDelete.images {
let store = Storage.storage()
let storageRef = store.reference(forURL: url)
storageRef.delete { error in
if let error = error {
print(error.localizedDescription)
} else {
print("Image file deleted successfully")
}
}
}
Firestore.firestore().collection("items").document(itemToDelete.id).delete() { error in
if let error = error {
print(error.localizedDescription)
} else {
print("Item deleted")
}
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("numberOfRows(): (items.count)")
return items.count
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ItemCell
let item = items[indexPath.row]
cell.itemNameLabel.text = item.name
if item.images.count > 0 {
let thumbnailUrl = item.images[0]
cell.itemImageView.sd_setImage(with: URL(string: thumbnailUrl), placeholderImage: UIImage(named: "photo"), completed: { (image, error, cacheType, imageUrl) in
cell.itemImageView.roundCornersForAspectFit(radius: 10)
})
} else {
cell.itemImageView.image = UIImage(named: "photo")
}
return cell
}
// Override to support conditional editing of the table view.
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
print("Items before delete: (items.count)")
deleteItem(at: indexPath)
// items.removeAll()
// tableView.reloadData()
items.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
print("Items after delete: (items.count)")
}
}

您可以使用属性观察器来处理您的tableView.reloadData()

var items = [Item]() {
didSet {
tableView.reloadData()
}
}

它上面所做的是,每当变量items被修改时,它都会触发didSet {}代码块。

希望能回答你的问题。

最新更新