从Firebase和UITableView删除时,索引超出范围

时间:2018-12-02 17:08:59

标签: swift firebase firebase-realtime-database

我目前遇到一个问题,当我尝试从表中删除一行时,我的应用程序崩溃并抛出索引超出范围错误。数据可以从firebase数据库和表中删除,但仍然会引发错误。

该数据库旨在存储播放列表,每个播放列表都有一个指向歌曲名称的键字典。这是我的firebase结构:enter image description here

下面是快速代码(发生错误的行带有注释)

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()
        })
    }
}

感谢您的帮助!

1 个答案:

答案 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