捕获UICollectionView在Swift中执行批量更新断言失败?

时间:2017-03-07 00:03:42

标签: ios swift uicollectionview

我正在使用UICollectionView的performBatchUpdates(_:completion:)方法。问题是,有时我的复杂差异逻辑会失败并返回不正确数量的要插入的部分。这会导致我插入的项目数与从数据源报告的数量不匹配。每当发生这种情况时,我们都会收到以下错误:

  

断言失败 - [CollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:]

     

执行批量更新时出错:无效更新:无效的节数。更新后的集合视图中包含的节数(25)必须等于更新前的集合视图中包含的节数(19),加上或减去插入或删除的节数(0插入,0删除)。

我意识到正确的解决方案是修复我的差异逻辑,使得返回的项目数和我调用的插入数之间没有不匹配。

但是,我想要做的是使即使我的逻辑在将来失败,而不是碰撞应用程序,它只会重新加载集合视图的数据。

如何在Swift中执行此操作?

1 个答案:

答案 0 :(得分:4)

默认情况下,无法在Swift中捕获NSExceptions,因此请创建类似于this onethis one的桥接器。

即使你发现断言失败,the user cannot interact with the collection view,你也需要重新创建集合视图。

TryCatch.try({
  collectionView.performBatchUpdates({
    collectionView.insertItems(at: indexPaths)
    collectionView.insertSections(sections)
  }, completion: nil)
}, catch: { exception in
  print("Error updating collection view: \(exception)")

  collectionView.removeFromSuperview()

  // recreate the collection view (make sure to set datasource and delegates)
  collectionView = ...
  collectionView.dataSource = ...
  collectionView.delegate = ...
}, finally: nil)