長い間、テーブルビューのほとんどが黒くなり(http://cl.ly/LFlSが残っているセルはごくわずかです)、他のビュー(同じMOCに接続されている)では他のビジュアルが表示されるという奇妙なバグが発生しています。グリッチが表示されます:http://cl.ly/LH3c(セクションヘッダーが重複していることに注意してください)。CoreDataのバグだといつも思っていましたが、デバッガーに接続されている間は、今日まで再現できませんでした。これが起こる直前に私が得た例外です:
CoreData:エラー:重大なアプリケーションエラー。-controllerDidChangeContent:の呼び出し中に、NSFetchedResultsControllerのデリゲートから例外がキャッチされました。 * -[__ NSArrayM insertObject:atIndex:]:userInfo(null)でオブジェクトをnilにすることはできません
それは私の方法の[tableView endUpdates]
ラインで止まりました。controllerDidChangeContent:
次に、[続行]をクリックしてもアプリはクラッシュしませんが、ユーザーの操作が非常に遅くなります。その例外の原因が何であるかをあちこち見てみましたが、何も見つかりませんでした。どんな手掛かり?
私のNSFetchedResultsControllerの変更処理は、Appleの定型文とほとんど同じように見えます。NSFRCの初期化は次のようになります。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Artist" inManagedObjectContext:[SWDataManager sharedManager].mainObjectContext];
[request setEntity:entity];
[request setFetchBatchSize:100];
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"sortName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
[request setSortDescriptors:@[sortByName]];
fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:mainObjectContext
sectionNameKeyPath:@"firstLetter"
cacheName:nil];
fetchedResultsController.delegate = self;
[self refreshDataSource]; // set fetch request predicate and call performFetch on NSFRC
return fetchedResultsController;
編集:これは間違いなく、MOCから、したがってテーブルビューから多数のオブジェクトが削除された後に発生したことを追加できます。
要求に応じて、私のcontrollerDidChangeContent:
コード:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
// this updates the section index and footer cell and other kind of stuff
[self performSelector:@selector(layoutSpecialCells) withObject:nil afterDelay:0.3];
}