Индекс вне диапазона при удалении из Firebase и UITableView - PullRequest
0 голосов
/ 02 декабря 2018

У меня сейчас проблема в том, что, когда я пытаюсь удалить строку из таблицы, мое приложение вылетает и выдает ошибку индекса из диапазона.Данные удаляются из базы данных firebase и таблицы, но все равно выдает ошибку.

База данных предназначена для хранения списков воспроизведения, и каждый список воспроизведения имеет словарь ключей для названия песни.Вот моя структура Firebase: enter image description here

А ниже приведен код swift (строка, где происходит ошибка, имеет комментарий)

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 голосов
/ 02 декабря 2018

Я думаю, что вы должны предпринять другой подход - обработать операцию удаления в обработчике завершения.Таким образом, вы будете уверены, что ваши данные будут согласованы.Потому что, что произойдет, если в вашем вызове 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.

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