У моего приложения есть UITableViewController, который использует FirebaseTableViewDataSource (из FirebaseUI). В таблице показаны закладками сообщений пользователя правильно, но когда я вхожу, что пользователь выключен, и войти другой пользователь в, то приложении падает со следующим сообщением:Авария FirebaseTableViewDataSource при выводе пользователя и подписании
* Нагрузочным приложение из-за неперехваченное исключение «NSInternalInconsistencyException», почему-то : «Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (2), плюс или минус количество вставленных или удаленных строк из этой секции (1 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этой секции (0 перемещено, 0 перемещено). '*
Я подозреваю, что проблема связана с тем, как FirebaseUI обновляет содержимое таблицыView. Я отлаживаю это за последние 4 дня; искали вопросы SO; прочитайте соответствующие документы, но никто не упоминает эту уникальную проблему. Любая помощь будет высоко ценится.
ПОДРОБНО.Подробнее (К сожалению, это на самом деле долго)
Это моя структура базы данных:
|
+-posts
| |
| +-$postid
| |
| +-/* properties of a post: title, text, etc */
|
+-users
|
+-$userid
|
+-bookmarks
|
+-post1: true
|
+-post2: true
Я использую FirebaseUI, чтобы показать пользователю его/ее закладки, передавая users/$userid/bookmarks
реф в FirebaseTableViewDataSource как запрос. Тогда для каждого ключа, я наблюдаю одно событие значения на posts/$postid
для того, чтобы восстановить почтовые реквизиты ... код ниже:
self.authStateListenerHandle = FIRAuth.auth()?.addStateDidChangeListener { auth, user in
guard let user = user else {
return
}
self.query = FIRDatabase.database().reference().child("users").child(user.uid).child("bookmarks")
self.tableViewDataSource = FirebaseTableViewDataSource(query: self.query!, view: self.tableView, populateCell: { (tableView, indexPath, snapshot) -> UITableViewCell in
if snapshot.exists() {
let postRef = FIRDatabase.database().reference().child("posts").child(snapshot.key)
let cell = tableView.dequeueReusableCell(withIdentifier: BookmarksVC.reuseIdentifier, for: indexPath) as! MiniTableCell
postRef.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
let post = Event(snapshot: snapshot)!
let postVM = EventViewModel(post: post)
cell.populateCellWithEvent(postVM)
cell.delegate = self
}
})
return cell
}
else {
return UITableViewCell()
}
})
self.tableView.dataSource = self.tableViewDataSource
}
я поставил выше код в viewDidAppear, а затем удалить authStateListenerHandle в viewWillDisappear как так
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let handle = self.authStateListenerHandle {
FIRAuth.auth()?.removeStateDidChangeListener(handle)
}
}
Почти все отлично, за исключением работ, когда я просматривать закладки для пользователя, а затем выйти и снова войти в систему, сбои приложений с сообщением
* Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк содержащиеся в этом разделе перед обновлением (2) плюс или минус количество строк, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено в , 0 выехал). *
В 'viewWillDisappear' установите' tableView.dataSource = nil'. Таким образом, вы не обновляете dataSource неправильно. –
@Frank, спасибо большое! Установка 'tableView.dataSource = nil' остановила сбой. Тем не менее, это привело к еще одной проблеме, приложение теперь сбой, когда я делаю следующее: перейдите в закладку vC, перейдите к другому VC, затем добавьте дочерний элемент в узел закладок пользователя вручную в консоли Firebase. Сообщение - это что-то о «вставке 1 строки в раздел 0 с помощью 0 строк ...». В любом случае, я решил проблему, установив 'self.tableViewDataSource = nil' (потому что это то, что я сам.tableView.dataSource в конечном итоге получает значение). Все работает правильно. – eyeezzi
@ Фрэнк, не могли бы вы пролить свет на то, почему я впервые столкнулся с крахом? Я знаю, что 'tableView.dataSource = nil' очищает источник данных для чистого запуска, но разве это не должно быть сделано FirebaseUI? – eyeezzi