删除Tableview数据和Firebase数据时,索引超出范围错误

时间:2020-01-22 02:04:29

标签: swift firebase firebase-realtime-database

我正在尝试删除Firebase数据库中的数据,然后侦听.childRemoved,以便可以更新TableView。我最初尝试使用下面的代码从数组中删除对象,但在cellForRowAt的{​​{1}}中出现了索引超出范围的错误。

indexPath.row

因此,我决定尝试首先删除Firebase数据,然后使用以下代码组合在func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { let post = posts[indexPath.row] posts.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .fade) DataService.ds.REF_POSTS.child(post.postKey).removeValue() DataService.ds.REF_USERS.child("\(uid!)").child("posts").child("\(post.postKey)").removeValue() //print("deleted post \(deletedPost)") } else if editingStyle == .insert { } } 处侦听(我注释掉了.childRemoved代码中数组对象的删除)。 / p>

editingStyle

然后,我在func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { let post = posts[indexPath.row] //posts.remove(at: indexPath.row) //tableView.deleteRows(at: [indexPath], with: .fade) DataService.ds.REF_POSTS.child(post.postKey).removeValue() DataService.ds.REF_USERS.child("\(uid!)").child("posts").child("\(post.postKey)").removeValue() //print("deleted post \(deletedPost)") } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. } } 的{​​{1}}上创建了一个监听器,内容如下。

.childRemoved

我仍在ViewDidLoad的{​​{1}}处收到索引超出范围错误。我在第二种方法上走对了吗?如果是这样,我在做什么错而导致超出范围的错误?

编辑:我将添加 newPost.observe(.childRemoved, with: { (snapshot) in //print("CHILD REMOVED") //print("\(self.posts)") //print("\(snapshot.postKey)") let postId = snapshot.key if let indexNew = self.posts.firstIndex(where: {$0.postKey == postId}){ self.posts.remove(at: indexNew) for n in 0...self.posts.count - 1 { print("POST \(n) - \(self.posts[n])") } print("REMOVE INDEX - \(indexNew)") print("POSTS AFTER REMOVAL - \(self.posts)") self.feedTableView.reloadData() } }, withCancel: nil) 和最新的cellForRowAt到我的indexPath.row中。由于调试语句打印

,因此我不确定如何在数组上运行
cellForRowAt

这是代码:

index out of range error

1 个答案:

答案 0 :(得分:0)

这种方法可以消除索引错误并正确更新tableView

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
       if (editingStyle == .delete) {
            let post = posts[indexPath.row]
            DataService.ds.REF_USERS.child("\(uid!)").child("posts").child("\(post.postKey)").removeValue()
        }

    }