google configurar auth agregar ios swift firebase firebase-database firebaseui

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.