Ошибка индекса вне диапазона при удалении данных таблицы и данных Firebase - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь удалить данные в моей базе данных Firebase и затем прослушать .childRemoved, чтобы я мог обновить TableView. Первоначально я пытался удалить объект из массива с помощью приведенного ниже кода, но получил ошибку индекса вне диапазона в cellForRowAt в indexPath.row.

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 {

    }
}

Итак, я решил попытаться удалить Firebase сначала данные, а затем прослушивание на .childRemoved со следующей комбинацией кода (я прокомментировал удаление объектов массива в коде 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.
    }
}

Затем я создал слушатель на .childRemoved в ViewDidLoad со следующим.

 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 и наиболее обновленный commit editingStyle. Я не уверен, как я работаю над массивом, так как операторы отладки печатают

INDEX OF POST ARRAY - 2
POSTS: SocialSpirit.Post
POSTS AFTER DELETE [SocialSpirit.Post, SocialSpirit.Post, SocialSpirit.Post]
INDEX OF POST ARRAY - 0
Fatal error: Index out of range

А вот код:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        let post = posts[indexPath.row]
        DataService.ds.REF_POSTS.child(post.postKey).removeValue()
        DataService.ds.REF_USERS.child("\(uid!)").child("posts").child("\(post.postKey)").removeValue()
        posts.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
        print("POSTS AFTER DELETE \(self.posts)")
        //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.
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    print("INDEX OF POST ARRAY - \(indexPath.row)")
    print("POSTS: \(posts[indexPath.row])") //Index out of range error here
    let post = posts[indexPath.row]
    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as? PostCell{
        if let img = FeedViewController.imageCache.object(forKey: post.imageUrl as NSString) {
            cell.configureCell(post: post, img: img)
        } else {
            cell.configureCell(post: post)
        }
        return cell
    } else {
        return PostCell()
    }

}

1 Ответ

0 голосов
/ 25 января 2020

Функция таким образом устраняет ошибку индекса и корректно обновляет 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()
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...