当用户在UITableView上滑动删除时,我试图从Firebase数据库中删除项目。
我还使用了来自https://github.com/erangaeb/dev-notes/blob/master/swift/ViewControllerUtils.swift的漂亮的showActivityIndicator和hideActivityIndicator函数,以便轻松显示和隐藏活动指示器。
运行以下代码时,我可以看到数据库记录以及从Firebase中正确删除的JPG文件。
但问题是活动指示器永远不会从屏幕上消失,UITableView也不会刷新。
实际上,
import java.net.MalformedURLException;
和
print("Stopping activity indicator")
甚至没有跑。
我做错了什么?
print("Reloading table view")
答案 0 :(得分:1)
仍然不确定为什么Firebase removeValue和删除功能下面的代码没有运行,但我设法找到了解决方法。
事实证明,只有当我删除表格中的最后一条剩余记录时,代码才会起作用,之后整个Firebase节点都会被删除。
所以,当发生这种情况时,我已经添加了一个观察者来强制重新加载表。
在viewDidLoad()下,我添加了以下行:
override func viewDidLoad() {
super.viewDidLoad()
// ... other preceding lines of code
// Forcefully trigger a TableView refresh in case the Firebase node is empty
refItems.observe(.value, with: { snapshot in
if snapshot.exists() {
print("Found the Firebase node")
} else {
print("Firebase node doesn't exist")
self.tableView.reloadData()
}
})
// ...other following lines of code
}
答案 1 :(得分:1)
在保持tableView和Firebase同步时,有两个主要选项:
1)从Firebase中删除节点时,请手动将其从中删除 从Firebase中删除时的tableView数据源。不需要观察者。
2)将删除事件观察者附加到Firebase,以便在删除节点时 您的应用程序将收到一个属于哪个节点的事件,并将其删除。
这是一个例子;为了简洁起见,我将tableView代码保留下来。
假设我们有一个显示用户的tableView。 tableView有一个usersArray的dataSource,它包含UserClass对象。
给定Firebase结构
users
user_0
name: "Frank"
user_2
name: "Bill"
user_3
name: "Hugh"
我们向用户节点添加了三个观察者,childAdded,childChanged,childRemoved
class UserClass {
var key = ""
}
var usersArray = [UserClass]()
let usersRef = self.ref.child("users")
usersRef.observe(.childAdded, with: { snapshot in
let user = UserClass()
user.key = snapshot.key
self.usersArray.append(user)
self.tableView.reloadData()
})
usersRef.observe(.childChanged, with: { snapshot in
if let index = self.usersArray.index(where: {$0.key == snapshot.key}) {
//update it in the array via the index
self.tableView.reloadData()
} else {
//item not found
}
})
usersRef.observe(.childRemoved, with: { snapshot in
if let index = self.usersArray.index(where: {$0.key == snapshot.key}) {
self.usersArray.remove(at: index) //remove it from the array via the index
self.tableView.reloadUI()
} else {
item not found
}
})
如果添加了用户,.childAdded观察者会收到新用户,因此可以将其附加到数组中。
如果更改了用户,则.childChanged观察者会收到更改后的用户。抓住密钥(通常是uid),在数组中找到它并更新属性。
如果删除了用户,则.childRemoved观察者会收到已删除的用户。拿起钥匙,在阵列中找到它并将其移除。
在每种情况下,在更改为dataSource后重新加载tableView。
答案 2 :(得分:0)
你需要在块中编写代码,如下所示:
imageRef.delete { error in
if let error = error {
print("Problem deleting photo")
} else {
print("Photo deleted successfully")
ViewControllerUtils().hideActivityIndicator(uiView: self.view)
print("Reloading table view")
// Reloading table view
self.tableView.reloadData()
}
}