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
。
- 在iPhone中dynamic更改UITableviewCell高度?
- 为货币格式化UITextField
- iOS:找出小数位数
- 以编程方式从Facebook注销iOS
- Int和Int32在Swift上有什么区别?
- 如何在UIScrollView中加载UIViewController
- Swift:尝试打印CLLocationSpeed时发生exception“意外地发现零,同时展开一个可选值”
- 将图像编码为base64,获取无效的base64string(使用base64EncodedStringWithOptions的ios)
- UIActivityViewController – 只为某些活动附加一个URL