Ios 如何处理Swift中Firebase DatabaseUI中的“断言失败”集合视图崩溃?
我正在我的应用程序上构建一个屏幕,其中配置文件将显示在集合视图上。我的数据正在从Firebase检索,这是我第一次使用Firebase DatabaseUI 我正在构建一个查询,然后创建一个FUICollectionViewDataSource,对单元格进行排队,然后将该数据源插入collectionView 只要我在在线和离线用户之间切换(检查查询中的子键的值),数据源的功能就可以正常工作,但当我将查询从男性更改为女性,或从女性更改为男性时,新查询本身就会出现NSInternalInconsistenencyException崩溃 ***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节0中的项数无效。”。更新1后现有节中包含的项目数必须等于更新1前该节中包含的项目数,加上或减去从该节中插入或删除的项目数1 inserted,0 deleted,以及加上或减去移入或移出该节的项目数0 moved in,“0搬走了。” ***第一次抛出调用堆栈: 0x18672d1b8 0x18516455c 0x18672d08c 0x1871e502c 0x18cedc14c 0x18c7b1d4c 0x10020f594 0x1002102c8 0x1001eb3e0 0x101609258 0x101609218 0x10160e280 0x1866da810 0x1866d83fc 0x1866062b8 0x1880ba198 0x18c64d7fc 0x18c648534 0x1000c4200 0x1855e95b8 libc++abi.dylib:以NSException类型的未捕获异常终止 在构建集合视图时,我习惯于只运行以下命令:Ios 如何处理Swift中Firebase DatabaseUI中的“断言失败”集合视图崩溃?,ios,swift,uicollectionview,firebase-realtime-database,firebaseui,Ios,Swift,Uicollectionview,Firebase Realtime Database,Firebaseui,我正在我的应用程序上构建一个屏幕,其中配置文件将显示在集合视图上。我的数据正在从Firebase检索,这是我第一次使用Firebase DatabaseUI 我正在构建一个查询,然后创建一个FUICollectionViewDataSource,对单元格进行排队,然后将该数据源插入collectionView 只要我在在线和离线用户之间切换(检查查询中的子键的值),数据源的功能就可以正常工作,但当我将查询从男性更改为女性,或从女性更改为男性时,新查询本身就会出现NSInternalInconsi
collectionView.dataSource = collectionViewDataSource
self.collectionView.reloadData()
但是现在像上面这样的调用不起作用,而且我没有使用UICollectionViewDataSource协议函数,我不确定如何创建、运行和显示新的查询,这些查询在每个部分中总是有不同数量的项
在处理新查询之前,为了不处理此类崩溃,我必须运行哪些函数
我已尝试从collectionView的indexPathsForVisibleItems中删除所有单元格,然后重新加载数据。。。我到处乱扔collectionView.reloadData,但仍然崩溃。并非总是如此,但该应用程序迟早会崩溃
如何在collectionView上启动一个全新的查询,而不必处理NSinternalinconsistenceException
谢谢大家。我喜欢Firebase,也很想弄明白这一点
-芦苇
当VC加载时,会调用getUserData函数。
当查询被更改时,resetQuery函数将从发布的通知运行
extension BrowseVC {
func getUserData() {
let isOnline = (segmentedControl.selectedSegmentIndex == 0) ? true : false
generateQuery(isOnline: isOnline)
populateDataSource()
}
func resetQuery() {
removeOldData()
getUserData()
}
func removeOldData() {
let indexPaths = collectionView.indexPathsForVisibleItems
collectionView.deleteItems(at: indexPaths)
// collectionView.reloadData()
}
func generateQuery(isOnline: Bool) {
if let selectedShowMe = UserDefaults.sharedInstance.string(forKey: Constants.ProfileKeys.ShowMe) {
let forMen = (selectedShowMe == Constants.ProfileValues.Men) ? true : false
query = FirebaseDB.sharedInstance.buildQuery(forMen: forMen, isOnline: isOnline)
} else {
query = FirebaseDB.sharedInstance.buildQuery(forMen: false, isOnline: isOnline)
}
}
func populateDataSource() {
if let query = query {
collectionViewDataSource = FUICollectionViewDataSource(query: query, view: collectionView, populateCell: { (view, indexPath, snapshot) -> ProfileCVCell in
if let cell = view.dequeueReusableCell(withReuseIdentifier: Constants.CollectionViewCellIdentifiers.ProfileCVCell, for: indexPath) as? ProfileCVCell {
if let userDictionary = snapshot.value as? [String: AnyObject] {
if let user = User(uid: snapshot.key, userDictionary: userDictionary) {
cell.populate(withUser: user)
}
}
return cell
}
return ProfileCVCell()
})
collectionView.dataSource = collectionViewDataSource
collectionView.reloadData()
// collectionView.performBatchUpdates({
// self.collectionView.dataSource = self.collectionViewDataSource
// }, completion: nil)
// collectionView.reloadData()
}
}
}
您遇到这种情况的原因是FirebaseUI数据库数据源负责将更新推送到集合视图本身。通过这种方式,您可以免费获得动画更新,并且不必调用reloadData
将旧数据源换成新数据源时,需要将数据源的“收集”视图设置为“零”,以便它停止将事件推送到“收集”视图。请更新您的问题。添加数据源和委派方法谢谢你,摩根。我真的很感谢你的帮助是否有合适的、推荐的方法来释放旧数据源?我在文档中找不到与此主题相关的任何内容。我不需要保留旧数据,因为它不会与用户更新的搜索参数对齐。let indexPaths=collectionView.indexPathsForVisibleItems collectionView.deleteItemsat:indexPaths collectionView.dataSource=nil@Morgan这就是我试图清除数据源的方式,由于不一致性,我仍然会崩溃异常。我试图清除数据源时出错***由于未捕获异常“NSInternalInconsistencyException”而终止应用程序,原因:“当集合视图中只有0项时,请求全局索引9223372036854775807的索引路径”***第一次抛出调用堆栈:0x1885091b8 0x186f4055c 0x18850908c 0x188fc102c 0x18e5907f0 0x18e5947b0 0x18E592C8 0x18ecbb200 0x18e3cc7dc 0x18ecba230 0x18ecb82d0 0x18e58dd4c 0x1001ed9e0 0x1001ee714 0x1001c982c 0x1023c12580x1023c1218 libc++abi.dylib:以NSExceptionI类型的未捕获异常终止我将为您在repo上提交一个问题,我们可以在下一版本中为API增加更多灵活性。