アプリを実行するたびに、次のエラーが突然発生します。
CoreData: 致命的なエラー: セクション情報の永続キャッシュが現在の構成と一致しません。キャッシュを無効にするか、+deleteCacheWithName を使用せずに、NSFetchedResultsController のフェッチ要求、その述語、またはそのソート記述子を不正に変更しました:
コール スタックの最初の 10 項目は次のとおりです。
*** First throw call stack:
(
0 CoreFoundation 0x04b835e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x022c68b6 objc_exception_throw + 44
2 CoreData 0x020a1b41 -[NSFetchedResultsController performFetch:] + 913
3 Syllable 0x00036aa9 -[RootViewController fetchedResultsController] + 777
4 Syllable 0x0003772b -[RootViewController tableView:numberOfRowsInSection:] + 91
5 UIKit 0x00d1d240 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2510
6 UIKit 0x00d20b3d -[UITableViewRowData numberOfRows] + 98
7 UIKit 0x00ba94c2 -[UITableView noteNumberOfRowsChanged] + 120
8 UIKit 0x00ba8e6f -[UITableView reloadData] + 814
9 UIKit 0x10378ed1 -[UITableViewAccessibility(Accessibility) reloadData] + 50
10 UIKit 0x00bac8d3 -[UITableView _reloadDataIfNeeded] + 65
他にもたくさんありますが、すべて私が投稿した最初のエラーに起因しているようです。それらが役立つ場合は、私に言ってください。投稿します。
しかし、問題は本当に奇妙です。ひょんなことから出てきたようです。git を使用して以前に動作していたバージョンに戻してもクラッシュするため、原因がわかりません。
Stackoverflow に投稿された解決策がありますが、少し不安です。キャッシュを nil に設定すると、アプリからキャッシュ機能が削除されたり、遅くなったりしますか? それはどのような影響をもたらすでしょうか?
アプリの新しい更新に取り組んでおり、最優先事項は、既存/将来のユーザーがクラッシュしないようにすることです。
編集:これが問題の原因だと思います(削除してから問題は解決しませんが):
applicationDidFinishLaunching
AppDelegate に次のコードがあります。これは基本的に、アプリの最初の起動時に Core Data に特別なオブジェクトを作成するのに役立ちます。これを追加した直後に、その後すぐにコードを削除したにもかかわらず、問題が発生したようです。この時点で Core Data を操作するべきではありませんか (早すぎますか)?
// If it's the first time launching, create and add a sample article for an introduction
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"IsFirstTimeLaunching"] isEqualToString:@"YES"]) {
NSManagedObjectContext *context = self.managedObjectContext;
Article *article = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:context];
article.source = @"text";
article.body = @"some text";
article.timeStamp = [NSDate date];
NSError *error;
[context save:&error];
[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"IsFirstTimeLaunching"];
}
私は AppDelegate にもこのブロックをかなり前から持っていますが、正直なところ、それが正確に何をするのかわかりません。書いたばかりで、完了するのを忘れていた可能性があります...
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSManagedObjectContext *context = self.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
}