Realmから取り込まれたUICollectionViewがあります。更新後のセクション0内の項目の無効な数の既存のセクションに含まれる アイテムの数(73)は 等しくなければなりません:一見ランダムで一部のユーザーは、NSInternalInconsistencyExceptionはRealmとUICollectionViewでNSInternalInconsistencyExceptionを防ぐ方法
無効な更新のようなものを述べてもらいます 更新(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
}
私は後でRealmGridControllerに切り替え
クラッシュの原因が見つからないため、RealmGridControllerに切り替えました。これは、Realmのコアコントリビュータが作成したパッケージであり、Realm + CollectionViewsで作業するために必要なすべての標準機能をカプセル化しています。
それはうまくいくように見え、まったく同じクラッシュを見始めました。
致命的な例外:NSInternalInconsistencyException無効更新: に含まれる項目の数既存のセクションの更新(78)の後セクション0の項目の 無効数は、その中に含まれるアイテムの数 に等しくなければなりません( が挿入され、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
おかげで、上、シミュレータ上問題ありませんでした。私は元に戻す。私のアプリはかなりの並行処理を行っています。このコレクションビューでイメージを表示しているので、バックグラウンドでサムネイルが表示され、資産レコードが領域内で更新されます。私は、同じスレッド内で領域とオブジェクトを保持することに注意しています。私は、ドキュメントが推奨するのと同じ方法でトランザクションを使用しています。私は役に立つかもしれない他の詳細を提供してくれることを嬉しく思います。また、別のスレッドからレコードを更新する際に注意すべき点がありますか? – SuitedSloth
心配はいりません!ええと、背景のスレッドでRealmに変更が加えられた場合は、注意が必要な場合があります。バックグラウンドで行われた変更は合体し、実行ループの次の反復でメインスレッドで表示されます。あなたのUIがそれまでに何か異なることをするなら、それは間違いなくクラッシュを引き起こす可能性があります。 BGでRealmに加えられた変更を見直すことは価値があるかもしれません。重すぎない場合は、主スレッドにそれらをプロモートすることもできます。 – TiM