如何处理'断言失败'集合在Swift中查看Firebase DatabaseUI中的崩溃?

时间:2017-01-27 04:53:56

标签: ios swift uicollectionview firebase-realtime-database firebaseui

我正在我的应用上构建一个屏幕,其中个人资料将显示在集合视图中。我的数据是从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()
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您遇到此问题的原因是FirebaseUI数据库数据源负责将更新推送到集合视图本身。这样您就可以免费获得动画更新,而且不应该调用reloadData。

当您将旧数据源换成新数据源时,需要将数据源的集合视图设置为nil,以便停止将事件推送到集合视图。