FirebaseTableViewDataSource在用户注销和登录时崩溃

我的应用程序有一个UITableViewController,它使用FirebaseTableViewDataSource(来自FirebaseUI)。 该表正确显示了用户的书签post,但是当我关闭该用户并将另一个用户登录时,该应用程序崩溃并显示以下消息:

*由于未捕获的exception’NSInternalInconsistencyException’而终止应用程序,原因:’无效更新:第0节中的行数无效。更新后的现有节中包含的行数(1)必须等于包含的行数在更新(2)之前的那一部分,加上或减去从该部分插入或删除的行数(插入1,删除0)和加或减移入或移出该部分的行数(0移入,0搬出)。’*

我怀疑问题与FirebaseUI如何更新tableView的内容有关。 我在过去的4天里一直在调试这个问题; 搜索了SO问题; 阅读相关文档,但没有人提到这个独特的问题。 任何帮助都感激不尽。

细节 (对不起,它实际上很长)

这是我的数据库结构:

| +-posts | | | +-$postid | | | +-/* properties of a post: title, text, etc */ | +-users | +-$userid | +-bookmarks | +-post1: true | +-post2: true 

我正在使用FirebaseUI通过将users/$userid/bookmarks ref作为查询传递给FirebaseTableViewDataSource来向用户显示他/她的书签。 然后,对于每个键,我在posts/$postid上观察单个值事件,以便检索post详细信息…代码如下:

 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中,然后在viewWillDisappear中删除authStateListenerHandle,就像这样

 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if let handle = self.authStateListenerHandle { FIRAuth.auth()?.removeStateDidChangeListener(handle) } } 

几乎一切正常,除了当我查看用户的书签,然后注销并重新登录时,应用程序崩溃并显示消息

*由于未捕获的exception’NSInternalInconsistencyException’而终止应用程序,原因:’无效更新:第0节中的行数无效。更新后的现有节中包含的行数(1)必须等于包含的行数在更新(2)之前的那一部分,加上或减去从该部分插入或删除的行数(插入1,删除0)和加或减移入或移出该部分的行数(0移入,0搬出)。’ *

viewWillDisappear设置self.tableViewDataSource = nil 。 因此,您不会不正确地更新dataSource