【发布时间】:2016-09-27 17:28:07
【问题描述】:
我有一个从 Realm 填充的 UICollectionView。一些用户,看似随机,得到一个 NSInternalInconsistencyException 声明类似
无效更新:第 0 节中的项目数无效。 更新 (73) 后包含在现有部分中的项目必须是 等于该部分中包含的项目数之前 更新(73),加或减插入或删除的项目数 从该部分(插入 1 个,删除 0 个)并加上或减去数字 移入或移出该部分的项目数(0 移入,0 移出)。
我的代码基于 Realm 的集合示例。它选择并过滤一些记录:
self.assets = realm.objects(Asset.self).filter("is_deleted = false")
然后它订阅并处理通知:
self.assetsNotificationToken = self.assets!.addNotificationBlock(){ [weak self] (changes: RealmCollectionChange) in
guard let collectionView = self!.collectionView else { return }
guard let strongSelf = self else { return }
switch changes {
case .Initial:
collectionView.reloadData()
case .Update(let _, let deletions, let insertions, let modifications):
strongSelf.collectionView?.performBatchUpdates({
collectionView.insertItemsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) })
collectionView.reloadItemsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) })
collectionView.deleteItemsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) })
}, completion: nil)
case .Error(let error):
log.error(error.localizedDescription)
break
}
}
计数来自:
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
guard assets != nil else {
return 0;
}
return assets!.count
}
我后来切换到RealmGridController
找不到崩溃源,我切换到RealmGridController。它是由 Realm 核心贡献者编写的一个包,它封装了使用 realm + CollectionViews 所需的所有标准功能。
它似乎有效,然后我开始看到完全相同的崩溃。
致命异常:NSInternalInconsistencyException 无效更新: 第 0 节中的项目数无效。包含的项目数 更新后的现有部分 (78) 必须等于数字 更新前该部分中包含的项目 (78),加上或 减去从该部分插入或删除的项目数(2 已插入,0 已删除)并加上或减去移入的项目数 或移出该部分(0 移入,0 移出)。
Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0x1839dadb0 __exceptionPreprocess
1 libobjc.A.dylib 0x18303ff80 objc_exception_throw
2 CoreFoundation 0x1839dac80 +[NSException raise:format:]
3 Foundation 0x184360154 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4 UIKit 0x18938b00c -[UICollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:]
5 UIKit 0x18938e464 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:]
6 UIKit 0x18938e2e0 -[UICollectionView _performBatchUpdates:completion:invalidationContext:]
7 UIKit 0x188d2c2a4 -[UICollectionView performBatchUpdates:completion:]
8 RealmGridController 0x1014a8340 specialized RealmGridController.controllerDidChangeContent(RBQFetchedResultsController) -> () (RealmGridController.swift:316)
9 RealmGridController 0x1014a687c @objc RealmGridController.controllerDidChangeContent(RBQFetchedResultsController) -> () (RealmGridController.swift)
10 RBQFetchedResultsController 0x100ff8edc __112-[RBQFetchedResultsController calculateChangesWithAddedSafeObjects:deletedSafeObjects:changedSafeObjects:realm:]_block_invoke.433 (RBQFetchedResultsController.m:842)
11 libdispatch.dylib 0x1834254bc _dispatch_call_block_and_release
【问题讨论】:
标签: ios swift uicollectionview realm