1

UPDATE :問題は、子コンテキストが保存されたときに親コンテキストが更新されないことだと思います。それでも、助けが必要です。


マルチコンテキスト (親子) コア データの多くの例を試しました。

以前は、私のアプリはデータを保存する従来の方法を使用していました。つまり、OperationQueue を使用して、サーバーからデータをフェッチし、MOC を使用して DB に保存し、保存時に mainMOC への通知を mergeChanges: NSManagedObjectContextDidSaveNotification に送信しました。

NSPrivateQueueConcurrencyTypeアプリのフローを乱すことなく (つまり、OperationQueue を削除する)、私は、persistantStoreCoordinator を持つ concurrencyTypeを持つ privateMOC と、NSMainQueueConcurrencyTypeその子であるconcurrencyType を持つ mainMOC を使用する親子 ManagedObjectContext 関係を実装しようとしました。プライベートMOC。そしてキューには、mainMOCNSPrivateQueueConcurrencyTypeの子である concurrencyType を持つ tempMOC があります。

保存中performBlockに、3 つの MOC を次のようにネストします -

[tempMOC performBlock:^{
        if (![tempMOC save:&error]) {
            NSLog(@"Error : %@",error);
        }
        [mainMOC performBlock:^{
            if (![mainMOC save:&error]) {
                NSLog(@"Error : %@",error);
            }
            [privateMOC performBlock:^{
                if (![privateMOC save:&error]) {
                    NSLog(@"Error : %@",error);
                }
            }];
        }];
    }];

mainMOC が保存しようとしているときに、CoreData 1560 や 1570 などのエラーが発生します。NSValidationErrorKey一部の値が であるというエラーnil。tempMOC の変更が mainMOC に反映されないということですか? 私は掘り下げませんでしたが、私の知る限り、それはゼロではありません。エラーの可能性は何ですか?助けてください。

更新: tempMOC のオブジェクトを印刷しようとしましたが、次のような適切な値が表示されます。

<Element_Name: 0xc0b59c0> (entity: Element_Name; id: 0xc07ca90 <x-coredata:///Element_Name/t2DCD57A8-4C1A-4AF7-A10E-5B9603E2BB8730> ; data: {
    tag1 = nil;
    tag2 = 3430065;
    tag3 = 600;
    tag4 = N;
    tag5 = "2013-10-29 00:00:00 +0000";
    tag6 = nil;
    tag7 = 327842701;
    relation = "0xbf1f760 <x-coredata://87C54A94-701E-4108-826E-4D98A53380F9/Relation/p1>";
    tag8 = "Some_Value";

mainMOC のオブジェクトを印刷しようとしましたが、次nilのようなデータの代わりに値が表示されます。

<Element_Name: 0xbd47a50> (entity: Element_name; id: 0xc0b14b0 <x-coredata:///Element_Name/t2DCD57A8-4C1A-4AF7-A10E-5B9603E2BB8740> ; data: {
    tag1 = nil;
    tag2 = nil;
    tag3 = 0;
    tag4 = nil;
    tag5 = nil;
    tag6 = nil;
    tag7 = nil;
    relation = "0xbd586c0 <x-coredata://87C54A94-701E-4108-826E-4D98A53380F9/relation/p1>";
    tag8 = nil;
4

2 に答える 2

0

Vshall、

バックグラウンド挿入 MOC パターンが既に機能している場合、なぜ親子 MOC 状況に移行しようとしているのでしょうか? 速くはありません。そして、あなたの実装について私が見ることができるものから判断すると、あなたはメインスレッドをブロックすることになります.

親子 MOC 関係を使用する正当な理由はたくさんあります。それらのほとんどには、スクラッチまたは読み取り専用の MOC の作成が含まれます。2 番目の大きなユース ケースは、メイン MOC をプライベート コンカレント MOC の子にすることです。そうすれば、保存は「高速」で、バックグラウンド スレッドで行われます。私の経験では、メイン MOC の子並行 MOC へのバックグラウンド挿入は遅くなり、UI が途切れます。

あなたの質問への回答として、埋め込まれた保存セットが完了する前にアイテムにアクセスしようとしています。したがって、データが破損し、例外が発生します。

アンドリュー

于 2013-10-30T13:23:05.170 に答える