私の状況:クラスPerson
(NSManagedObjectのサブクラス)があると仮定します。ユーザーがボタンをクリックするたびに、新しいPersonインスタンスが作成され、グローバルNSMutableArrayに追加されます。また、新しく作成されたPersonインスタンスは、次のように子コンテキストに追加されます。
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateConcurrencyType];
[childContext setParentContext: _mainContext];
また、ボタンをクリックすると、コンテキストが保存されます:(少し複雑ですが、この構造に従います)
[childContext performBlock:^{
[childContext save:nil];
[_mainContext save:nil];
}];
2回以上クリックすると(合計クリック数に依存するかどうかはわかりません)、配列内のボタンオブジェクトはになりfault
ます。
ドキュメントによると:障害オブジェクトのプロパティにアクセスすると、永続オブジェクトが読み込まれるはずです。
NSManagedObjectのプロパティにアクセスしているときでも、オブジェクトに障害があり、プロパティはnil
です。
配列内のオブジェクトに障害が発生するのはなぜですか?障害オブジェクトのプロパティにアクセスするにはどうすればよいですか?
編集:
UIViewControllerをロードするとき、データストアから既存のすべてのオブジェクトをフェッチしています。
-(NSArray*)fetchPersons {
NSManagedObjectContext *context = [self managedObjectContext]; //this is _mainContext, it is created with initWithConcurrencyType:NSMainQueueConcurrencyType
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *description = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[fetchRequest setEntity:description];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key = %i", aCondition];
[fetchRequest setPredicate:predicate];
return [context executeFetchRequest:fetchRequest error:nil];
}
このNSArrayfromを使用しfetchPersons
てNSMutableArrayにデータを入力しています。
新しいPersonオブジェクトの作成:
-(Person*)createPerson {
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
[childContext setParentContext:[self managedObjectContext]];
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:childContext];
return person;
}
òbjectID`でオブジェクトを処理する方法がわかりません。一時的なコンテキストとしてchildContextを使用しています。Personインスタンスが必要な場合もありますが、永続ストアに保存したくない(または最初にメインコンテキストに挿入したくない)。
これらすべての手順を実行すると、NSMutableArrayにすべてのオブジェクトが含まれます。いくつかのオブジェクトを作成した後、nilプロパティ(フォールトオブジェクト)を取得し、それらの属性(person.name
または何か)をログに記録しようとしました。