12

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の質問からこの答えを見つけました:「これは、オブジェクトが別のコンテキストで作成されたためであり、別のスレッドではなく、同じスレッドの別のコンテキストに注意してください。」

これは事実のように思われますか?もしそうなら、私が保存しようとしているものとは異なるコンテキストでオブジェクトが作成された場所をどのように見つけることができますか...

4

3 に答える 3

8

うーん、そのコードで変更することがいくつかあります。

  1. エラーポインタを使用してください。それが目的です。あなたはおそらくそれから解決策を得るでしょう。NSErrorポインタを渡し、呼び出しからの戻りを確認し-save:、失敗時にコンソールにエラーを吐き出します。

  2. あなたのキュー管理は少し怖いです。を行う代わりにdispatch_async()、それをに変更し-[NSManagedObjectContext performBlock:]ます。これにより、アクセスしているコンテキストに適したスレッド/キューにいることが保証されます。あなたが書いた方法では保証がなく、したがって保守性は低いです。

これらの2つの変更を行っても失敗する場合は、NSErrorオブジェクトからの出力で質問を更新すると、何が起こっているかを確認できます。

アップデート1

保存でエラーが発生していなくても、不足している情報が得られる可能性があるため、その戻り値とエラーを確認する必要があります。

クラッシュを再現する場合は、ここに返信してください。

アップデート2

わかりました。これは、さまざまなMOCでオブジェクトを作成し、すでに収集した関係を介してそれらを接続していることを示している傾向があります。オブジェクトをいつどのように作成するかを投稿または説明できますか?使用しているMOCは何ですか?

保存のために更新されたコードを投稿することもできますか?

于 2013-01-29T20:48:03.750 に答える
3

同じ問題に直面していますが、これを設定することで解決しましたFetchrequest

[fetchrequest setReturnsObjectsAsFaults:NO];
于 2017-09-20T04:15:16.507 に答える
2

私のコードでもこの問題が発生しました。後で、メインスレッドNSManagedObjectContextによって作成された管理対象オブジェクトをバックグラウンドスレッドで使用していることに気付きました。管理対象オブジェクトはスレッドセーフではないことで有名なので、コードを変更すると、このバグが二度と発生することはなく、コードは非常にうまく機能します。したがって、これは、作成またはフェッチされたスレッド以外のスレッドで管理対象オブジェクトを使用して不平を言うIOSの方法だと思います。

この助けを願っています。

于 2013-09-06T13:59:24.977 に答える