我目前遇到一个问题,当我尝试从表中删除一行时,我的应用程序崩溃并抛出索引超出范围错误。数据可以从firebase数据库和表中删除,但仍然会引发错误。
该数据库旨在存储播放列表,每个播放列表都有一个指向歌曲名称的键字典。这是我的firebase结构:
下面是快速代码(发生错误的行带有注释)
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let song = songs[indexPath.row]
var songKey = ""
if(editingStyle == .delete){
let ref = Database.database().reference().child("Playlists/\(playlist!)")
ref.observe(.value, with: {
snapshot in
let someData = snapshot.value! as! [String: String]
for data in someData {
if(data.value == song){
songKey = data.key
break
}
}
ref.child(songKey).removeValue()
self.songs.remove(at: indexPath.row) //error on this line
self.myTableView.deleteRows(at: [indexPath], with: .fade)
self.myTableView.reloadData()
})
}
}
感谢您的帮助!
答案 0 :(得分:1)
我认为您应该采取的另一种方法-在其完成处理程序中处理删除操作。这样,您将确保您的数据是一致的。因为如果您的Firebase呼叫发生错误会怎样?您也必须处理这种情况。所以做这样的事情,看看会发生什么:
ref.child(songKey).removeValue { [weak self] error, _ in
if let error = error {
print("There was an error: ", error)
return
}
self?.songs.remove(at: indexPath.row)
self?.tableView.reloadData()
}
我认为这里正在发生的事情是您的代码进入了无限循环-您在playlists
上使用了观察,然后删除了。因此,将再次调用observe
的完成处理程序,并再次调用delete
。在此索引处删除项目后,该索引将不再在您的数组中找到。因此,只需从数据库中获取播放列表,而无需进行任何进一步的更改。
在这种情况下,请尝试使用observeSingleEvent
。