私はRealte for Swiftを使用していて、データをUITableViewにロードしています。私は画面に入ると徐々にダウンロードされている約200のデータオブジェクトがあるので、テーブルビューが表示された後、私のテストでUITableViewに多くの挿入が行われます。私はRealmCollectionChangeと一緒にaddNotificationBlockをできるだけ近くでRealmの例を使用しています。このプロセス中に時々起こる2つの別々のクラッシュが発生しています。addNotificationBlock {RealmCollectionChange}がUITableViewでクラッシュする
- ***キャッチされていない例外 'RLMException'のためアプリを終了しています、理由: 'runloops内からの通知ブロックのみを追加できます。'
このクラッシュは、ViewControllerクラス内のメインスレッドからすべてのデータを取得しても発生します。
- ***アサーション失敗 - [のUITableView _endCellAnimationsWithContext:]、/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.30.14/UITableView .m:1720 ****キャッチされていない例外 'NSInternalInconsistencyException'によるアプリケーションの終了、理由: '無効な更新:セクション0の行数が無効です。更新(27)後に既存のセクションに含まれる行数は、更新前のそのセクションに含まれる行の数に等しい(17)、そのセクションに挿入または削除された行の数をプラスまたはマイナスし(挿入された9個、削除された0個)、プラスまたはマイナスに移動した行の数(0は移動し、0は移動しました)。私は私のaddNotificationBlock
の.Update()セクションに
tableView.beginUpdates() tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) tableView.endUpdates()
で
tableView.reloadData()
を交換した後
このクラッシュは発生し始めた私が欠けている何かがありますこれを引き起こしているレルムについて?私はそれが私がこのライブラリの内部メカニズムを完全に理解していないためだと思う。
は、ここに参考のために私のコードです:あなたがここに物事を少し過度に複雑かもしれないようですね
self.exhibits = DataManager.getAllExhibitsSorted("id")
token = self.exhibits?.addNotificationBlock { (changes: RealmCollectionChange) in
switch changes {
case .Initial(_):
self.exhibits = DataManager.getAllExhibitsSorted("id")
self.exhibitListTableView.reloadData()
break
case .Update(_, let deletions, let insertions, let modifications):
// Query results have changed, so apply them to the UITableView
self.exhibitListTableView.beginUpdates()
self.exhibitListTableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
self.exhibitListTableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
self.exhibitListTableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
self.exhibitListTableView.endUpdates()
break
case .Error:
NSLog("Error in notificationBlock")
break
}
}
ありがとう、それはトリックでした! –
それはほとんどの時間を修正することができましたが、ダウンロード中に無線LANのオンとオフを切り替えると、まだNSInternalInconsistencyExceptionが発生しています。おそらく、notificationBlock間の競合状態です。更新とself.exhibits内に存在する値。そのエラーをどのように捕捉するかについてのちょっとした助けさえあれば十分でしょう。 .Updateのものはどれもエラーを投げかけることはないので、do-catchでそれを囲むことはできません。 –
私は全く同じ問題を抱えています。あなたはこれを解決しましたか?それはレルムのどこかの競合状態のようです。私はレルムのドキュメントに示されているようにコード100%を使用しています... –