Ios 如何处理Swift中Firebase DatabaseUI中的“断言失败”集合视图崩溃?

Ios 如何处理Swift中Firebase DatabaseUI中的“断言失败”集合视图崩溃?,ios,swift,uicollectionview,firebase-realtime-database,firebaseui,Ios,Swift,Uicollectionview,Firebase Realtime Database,Firebaseui,我正在我的应用程序上构建一个屏幕,其中配置文件将显示在集合视图上。我的数据正在从Firebase检索,这是我第一次使用Firebase DatabaseUI 我正在构建一个查询,然后创建一个FUICollectionViewDataSource,对单元格进行排队,然后将该数据源插入collectionView 只要我在在线和离线用户之间切换(检查查询中的子键的值),数据源的功能就可以正常工作,但当我将查询从男性更改为女性,或从女性更改为男性时,新查询本身就会出现NSInternalInconsi

我正在我的应用程序上构建一个屏幕,其中配置文件将显示在集合视图上。我的数据正在从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类型的未捕获异常终止

在构建集合视图时,我习惯于只运行以下命令:

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增加更多灵活性。