我正在我的应用上构建一个屏幕,其中个人资料将显示在集合视图中。我的数据是从Firebase检索到的,这是我第一次使用Firebase DatabaseUI。
我正在构建一个查询,然后创建一个FUICollectionViewDataSource
,将我的单元格出列,然后将该dataSource插入到collectionView中。
只要我在在线和离线用户之间切换(检查查询中子键的值),dataSource的功能就可以正常工作,但是当我将查询更改为从男性到女性时,或者女人对男人,(一个新的问题本身)我正在崩溃NSInternalInconsistenencyException
。
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的项目数无效。更新后的现有部分中包含的项目数(1)必须等于更新前该部分中包含的项目数(1),加上或减去从该部分插入或删除的项目数(插入1个,删除0个),加上或减去移入或移出该部分的项目数量( 0移入,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类型的未捕获异常终止
当我构建集合视图时,我习惯于运行这样的命令:
collectionView.dataSource = collectionViewDataSource
self.collectionView.reloadData()
但是现在上面的调用不起作用,而且我没有使用UICollectionViewDataSource
协议功能,我不确定如何创建,运行和显示总是有不同数字的新查询每节的项目。
在处理新查询以处理这些类型的崩溃之前,我必须运行哪些功能?
我已经尝试删除collectionView的indexPathsForVisibleItems
中的所有单元格,然后重新加载数据......我已经遍布collectionView.reloadData()
并且仍然崩溃。不是所有的时间,但应用程序迟早会崩溃。
如何在collectionView上启动全新查询而不必处理NSInternalInconsistencyExceptions
?
谢谢大家。我喜欢Firebase,很想知道这个!
-Reezy
当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()
}
}
}
答案 0 :(得分:1)
您遇到此问题的原因是FirebaseUI数据库数据源负责将更新推送到集合视图本身。这样您就可以免费获得动画更新,而且不应该调用reloadData。
当您将旧数据源换成新数据源时,需要将数据源的集合视图设置为nil
,以便停止将事件推送到集合视图。