私のコアデータアプリケーションではinitWithEntity:insertIntoManagedObjectContext:
をnil
コンテキストで初期化しています。その後、必要に応じて、[managedObjectContext insertObject:object]
を使用して、オブジェクトをコンテキストに挿入します。管理対象オブジェクトが初期化され、管理オブジェクトコンテキストに挿入されていない場合、コアデータオブジェクトのプロパティはnilです
これがinsertObject:
APIが存在する理由です。作成中に挿入されなかった管理対象オブジェクトを挿入する。
しかし、上記のロジックを使用すると、オブジェクト(後でMOCからフェッチされるとき)にはnilプロパティがあります。オブジェクト上の文字列は永続化されません。
私が代わりにnil以外 MOCとinitWithEntity:insertIntoManagedObjectContext:
を使用する場合は、プロパティが永続化されると、すべてが正常に動作します。この場合、私はinsertObject:
に電話をしません。
コードの2つの違いは以下のとおりです。 useNilContext
フラグをトグルするだけで、それぞれ試してみることができます。私はコアデータからオブジェクトをフェッチし、それを点検するとき
// ...
BOOL useNilContext = YES;
[[XYZBackend sharedBackend].managedObjectContextPrivateQueue performBlock:^{
XYZObject *object = [XYZObject objectFromJSON:json useNilContext:useNilContext];
if (useNilContext) {
[[XYZBackend sharedBackend].managedObjectContextPrivateQueue insertObject:object];
}
NSError *privateQueueError = nil;
if (![[XYZBackend sharedBackend].managedObjectContextPrivateQueue save:&privateQueueError]) {
NSLog(@"Error saving Core Data managed object context in private queue! %@", privateQueueError);
}
}];
// ...
+ (instancetype)managedObjectFromJSON:(NSDictionary *)json useNilContext:(BOOL)useNilContext {
__block XYZManagedObject *object = nil;
[[XYZBackend sharedBackend].managedObjectContextPrivateQueue performBlockAndWait:^{
NSEntityDescription *entity = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:[XYZBackend sharedBackend].managedObjectContextPrivateQueue];
NSManagedObjectContext *context = [XYZBackend sharedBackend].managedObjectContextPrivateQueue;
if (useNilContext) {
context = nil;
}
object = [[XYZManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
object.stringProperty = json[@"string"];
}];
return object;
}
その後、私は、オブジェクトが最初にMOCに挿入された場合に応じて異なる動作を取得します。 MOCがnil
の場合、オブジェクトのプロパティはすべて、フェッチ後にnil
になります。 nil以外のMOCで初期化
Printing description of object:
<XYZObject: 0x60b0000b80d0> (entity: XYZObject; id: 0xd000000000040000 <x-coredata://5F843602-C03B-4339-AC50-0F70FD1545C9/XYZObject/p1> ; data: {
stringProperty = nil;
})
:
Printing description of object:
<XYZObject: 0x60b000054680> (entity: XYZObject; id: 0xd000000000040000 <x-coredata://72502855-7204-4485-828C-BC07C51F7FE2/XYZObject/p1> ; data: {
stringProperty = "string";
})
あなたが見ることができるようにオブジェクトがありませんでしたときにフェッチした後に、プロパティがnil
あるnil
MOCとinitWithEntity:insertIntoManagedObjectContext:
を使用して
最初にMOCに挿入される。それが最初にMOCに挿入されるとき、プロパティは非ゼロであり、持続される。
なぜこれらのプロパティは保持されませんか?私は2つのコード戦略が同一でなければならないと思います。
最初にnil
管理オブジェクトコンテキストを持つ管理対象オブジェクトのプロパティを維持するためには、別の手順が必要ですか?
設定した前後でオブジェクトstringPropertyを検査しようとしましたか?どちらの場合でも実際に設定されていますか? – Yan