我有一个从领域填充的UICollectionView。有些用户,似乎是随机的,得到了一个NSInternalInconsistencyException,声明如下
无效更新:第0节中的项目数无效。更新(73)后一个现有节中包含的项目数必须等于更新(73)之前该节中所包含的项目数,加上或减去从该节插入或删除的项目数(1插入,0删除),加上或减去移入或移出该节的项目数(0移动,0移出)。
我的代码基于王国的集合示例。它选择并过滤一些记录:
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
}
I后来切换到 RealmGridController
由于找不到坠机的原因,我切换到RealmGridController。它是一个由领域核心贡献者编写的包,它封装了使用王国+ 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
发布于 2016-10-12 09:24:48
在我的情况下,我有一个拉力刷新和无限负荷下降。
当我想刷新时,我正在删除所有对象,以便在web服务调用之前获得新的新数据。
try! Realm().write {
let demands = Realm().objects(Demand.self)
for demand in demands {
Realm().delete(demand)
}
}
它触发了更改通知,但在有时间执行删除动画之前,我收到了带有一个新项的web服务的响应,即创建NSInternalInconsistencyException
。
所以我试着:
try! Realm().write {
let demands = Realm().objects(Demand.self)
for demand in demands {
Realm().delete(demand)
}
}
collectionView?.reloadData()
但没起作用。最后我做了:
try! Realm().write {
let demands = Realm().objects(Demand.self)
for demand in demands {
Realm().delete(demand)
collectionView?.reloadData()
}
}
而且起作用了!这样做的目的是在调用通知之前对reloadCollectionView进行访问。希望能帮上忙。
注意:我在模拟器上没有任何问题,只有在真正的iPhone 6设备iOS 10上。
https://stackoverflow.com/questions/39730887
复制相似问题