configurar - firebase ios
FirebaseTableViewDataSource se bloquea en el inicio de sesión de usuario y en iniciar sesión (1)
Mi aplicación tiene un UITableViewController que usa FirebaseTableViewDataSource (de FirebaseUI). La tabla muestra las publicaciones marcadas por el usuario correctamente, pero cuando la cierro y registro otro usuario, la aplicación falla con el siguiente mensaje:
* Aplicación de finalización debido a excepción no detectada ''NSInternalInconsistencyException'', razón: ''Actualización inválida: número inválido de filas en la sección 0. El número de filas contenidas en una sección existente después de la actualización (1) debe ser igual al número de filas contenidas en esa sección antes de la actualización (2), más o menos el número de filas insertadas o eliminadas de esa sección (1 insertado, 0 eliminado) y más o menos el número de filas movidas dentro o fuera de esa sección (0 ingresado, 0 mudado).''*
Sospecho que el problema está relacionado con la forma en que FirebaseUI actualiza el contenido de tableView. He estado depurando esto durante los últimos 4 días; buscó las preguntas SO; lea los documentos pertinentes, pero ninguno menciona este problema único. Cualquier ayuda será muy apreciada.
Los detalles (lo siento, es realmente largo)
Esta es mi estructura de base de datos:
|
+-posts
| |
| +-$postid
| |
| +-/* properties of a post: title, text, etc */
|
+-users
|
+-$userid
|
+-bookmarks
|
+-post1: true
|
+-post2: true
Estoy usando FirebaseUI para mostrarle a un usuario sus marcadores al pasar los users/$userid/bookmarks
ref a FirebaseTableViewDataSource como una consulta. Luego, para cada clave, observo un evento de valor único en posts/$postid
para recuperar los detalles de la publicación ... código a continuación:
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
}
Pongo el código anterior en viewDidAppear y luego elimino authStateListenerHandle en viewWillDisappear como tal
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let handle = self.authStateListenerHandle {
FIRAuth.auth()?.removeStateDidChangeListener(handle)
}
}
Casi todo funciona bien excepto que, cuando estoy viendo los marcadores para un usuario, luego cierro la sesión y vuelvo a iniciar sesión, la aplicación se cuelga con el mensaje
* Aplicación de finalización debido a excepción no detectada ''NSInternalInconsistencyException'', razón: ''Actualización inválida: número inválido de filas en la sección 0. El número de filas contenidas en una sección existente después de la actualización (1) debe ser igual al número de filas contenidas en esa sección antes de la actualización (2), más o menos el número de filas insertadas o eliminadas de esa sección (1 insertado, 0 eliminado) y más o menos el número de filas movidas dentro o fuera de esa sección (0 ingresado, 0 mudado).'' *
En viewWillDisappear
establece self.tableViewDataSource = nil
. Entonces, no actualiza el dataSource
incorrectamente.