4

長い間、テーブルビューのほとんどが黒くなり(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];
}
4

3 に答える 3

3

私は最終的にAppleにTSIを要求しましたが、得られた回答の要点は次のとおりです。

データストアの整合性を保護するために、Core Data は操作中に発生するいくつかの例外をキャッチします。これは、Core Data がデリゲート メソッドを介してコードを呼び出す場合、Core Data がコードがスローした例外をキャッチすることになることを意味する場合があります。

この場合、Core Data は、-insertObject:atIndex を使用して NSMutableArray に入れようとしたために、-controllerDidChangeContent: メソッドから例外をキャッチしnilました。

したがって、基本的にその例外は私のコードによってスローされ、必ずしも Core Data フレームワークによってスローされるわけではありません。私はまだ例外の根本的な原因を見つけることができなかったので、アドバイス:

マルチスレッド エラーは、不可解な Core Data の問題の最も一般的な原因です。

長い道のりを歩み、Core Data コードの一部がperformBlock:呼び出し内にカプセル化されていないことに気付きました。それを修正したら、問題が再び発生するのを見たことはありません。

于 2013-01-25T22:05:24.070 に答える
0

私たちはまったく同じ問題を抱えているわけではありませんが、あなたが説明したエラーは私のものと同じでした. これを見たときには存在していなかった新しい API をいくつか使用していますが、問題は解決したと思います。興味がある場合は、アップデート 5 をチェックしてください。NSFetchedResultsController が nil オブジェクトを挿入しようとしています

于 2013-10-23T22:41:46.593 に答える
0

の後に UI を更新するのはなぜ[tableView endUpdates];ですか? 遅延のある別のセレクターでそれを行うのはなぜですか?

これは非常に疑わしい設計であり、問​​題の原因である可能性が高いようです。指定されたメソッドで NSFetchedResultsControllerDelegate によって生成されたすべての UI 更新を行うことを強くお勧めします。

于 2012-11-30T13:26:19.110 に答える