Core-Dataオブジェクトの使用中に、アプリが次のエラーでクラッシュすることがあります。
CoreData:エラー:NULL _cd_rawDataですが、オブジェクトは障害になりません
私がインターネットから調べて読んだことから、これは、管理対象オブジェクトのコンテキストが2つのスレッド間で渡され、MOCがスレッドセーフではない場合に発生するということです。
このクラッシュは、CDオブジェクトからプロパティにアクセスしたいときに表示されます。
Personオブジェクトがあり、Perosn.nameにアクセスしたい場合、アプリはこのエラーでクラッシュする可能性があります(前述のように、ランダムに表示できる範囲で発生し、再現できません。10回続けて発生する場合があります。 1日か2日は起こりません)。
この問題を見ると、Person IがPersonの友達関係を取得して更新したときに発生するようです(これはバックグラウンドスレッドで行われ、保存されてメインスレッドMOCにマージされます)。
ここで何が起こっているのか、かなりランダムに見えるのになぜこのエラーが発生するのか、クラッシュを防ぐ方法があるのかについて、より多くの情報を入手したいと思います。
以下は、コンテキストが保存されるコードです。
__block MyAppDelegate *blockSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[blockSelf.managedObjectContext performBlock:^{
[blockSelf.managedObjectContext save:nil];
dispatch_async(blockSelf.core_data_queue, ^{
[blockSelf.writerContext performBlock:^{
[blockSelf.writerContext save:nil];
}];
});
}];
});
Update 1 saveContextを実行すると、次のエラーが発生することがあります。
"Error Domain = NSCocoaErrorDomain Code=1550"操作を完了できませんでした。(ココアエラー1550。)
無効なオブジェクトへのぶら下がり参照。=null
NSLocalizedDescription=操作を完了できませんでした。(Cocoaエラー1550。)、NSValidationErrorValue =管理対象オブジェクトの関係'友達'(0x201cd340)
UID:<4C1B48C8-6309-4E8E-A590-DED497907A3A>。アセットID:(null)。オブジェクト付き{(\ n'(null)' UID:<(null)>。)}} "
私は別のSOの質問からこの答えを見つけました:「これは、オブジェクトが別のコンテキストで作成されたためであり、別のスレッドではなく、同じスレッドの別のコンテキストに注意してください。」
これは事実のように思われますか?もしそうなら、私が保存しようとしているものとは異なるコンテキストでオブジェクトが作成された場所をどのように見つけることができますか...