0

私はしばらくの間この問題に取り組んできましたが(https://stackoverflow.com/questions/12982012/unit-testing-core-data-to-many-relationship)、ついに何を識別できるようになりました本当の問題はです。何をしようとしても、メインのmanagedObjectContextで常に作成されている単一のエンティティがあります。私の他のすべてのエンティティは正常に動作しますが、特にこれには何か問題があるようです。前の質問に新しい名前を付けてから、データモデル全体を再構築しましたが、問題は引き続き発生しました。検索してみたところ、同様の問題を参照する1つの質問(コアデータオブジェクトの一部でmanagedObjectContextがnilに設定されているのはなぜですか? )が表示され、彼はnilに設定されていました。

私がやろうとしているのは、バックグラウンドで実行するデータをインポートするための新しいコンテキストを作成することです。

これがすべてを説明するログです

1つ目は[selfmanagedObjectContext]です。私はこれを使用して、AppleベースのCoreDataアプリから直接コードを持っているAppDelegateからMOCを呼び出しています。

- (NSManagedObjectContext *)managedObjectContext
{
    return [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

メインのmanagedObjectContextを使用するLoginVCで

Deal *testdeal = [NSEntityDescription insertNewObjectForEntityForName:@"Deal" inManagedObjectContext:[self managedObjectContext]];
TriageAnswer *testtriage = [NSEntityDescription insertNewObjectForEntityForName:@"TriageAnswer" inManagedObjectContext:[self managedObjectContext]];
NSLog(@"moc is %@", [self managedObjectContext]);
NSLog(@"testdeal.moc = %@", testdeal.managedObjectContext);
NSLog(@"testtriage.moc = %@", testtriage.managedObjectContext);   

2012-10-30 17:51:19.134 myApp[6507:11603] moc is <NSManagedObjectContext: 0x84ace20>
2012-10-30 17:51:19.134 myApp[6507:11603] testdeal.moc = <NSManagedObjectContext: 0x84ace20>
2012-10-30 17:51:19.134 myApp[6507:11603] testtriage.moc = <NSManagedObjectContext: 0x84ace20> 

複数のmanagedObjectContextsを使用する私の更新クラス。importContext2は、テスト目的で思いついたものです。

NSManagedObjectContext *importContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[importContext setParentContext:[self managedObjectContext]];
[importContext setUndoManager:nil];

NSManagedObjectContext *importContext2 = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[importContext2 setParentContext:importContext];

Deal *importDeal = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Deal class]) inManagedObjectContext:importContext];
Deal *importDeal2 = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Deal class]) inManagedObjectContext:importContext2];
Deal *importDeal3 = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Deal class]) inManagedObjectContext:[self managedObjectContext]];
TriageAnswer *importTriage = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([TriageAnswer class]) inManagedObjectContext:importContext];
NSLog(@"importcontext is %@", importContext);
NSLog(@"importcontext 2 is %@", importContext2);
NSLog(@"self managedobjectcontext is %@", [self managedObjectContext]);
NSLog(@"deal is %@", importDeal.managedObjectContext);
NSLog(@"deal2 is %@", importDeal2.managedObjectContext);
NSLog(@"deal3 is %@", importDeal3.managedObjectContext);
NSLog(@"triage moc is %@", importTriage.managedObjectContext);

2012-10-30 17:54:16.571 myApp[6507:11603] importcontext is <NSManagedObjectContext: 0x84b3ce0>
2012-10-30 17:54:20.403 myApp[6507:11603] importcontext 2 is <NSManagedObjectContext: 0x14163890>
2012-10-30 17:54:22.876 myApp[6507:11603] self managedobjectcontext is <NSManagedObjectContext: 0x84ace20>
2012-10-30 17:54:24.296 myApp[6507:11603] deal is <NSManagedObjectContext: 0x84ace20>
2012-10-30 17:54:25.017 myApp[6507:11603] deal2 is <NSManagedObjectContext: 0x84ace20>
2012-10-30 17:54:25.646 myApp[6507:11603] deal3 is <NSManagedObjectContext: 0x84ace20>
2012-10-30 17:56:34.221 myApp[6507:11603] triage moc is <NSManagedObjectContext: 0x84b3ce0>
4

1 に答える 1

0

誰かが私がした間違いを犯した場合に備えて、自分でこれに答えるつもりです。しかし、私のすべてのNSManagedObjectサブクラスには、それらのために作成されたカテゴリがあり、ある時点で私は素朴に入れました

- (NSManagedObjectContext *)managedObjectContext
{
    return [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

私のカテゴリーで。カスタムフェッチリクエストを実行するための別のメソッドを作成していて、MOCにアクセスするためにそれが必要だと思いましたが、明らかにそうではありません。それを実装することは完全に受け入れられるので、それはカテゴリー内に埋もれてしまい、忘れられていました。したがって、DealオブジェクトがMOCにアクセスしようとすると、呼び出しがオーバーライドされ、メインのMOCが返されていました。

于 2012-11-01T18:05:29.757 に答える