概要: バックグラウンドで実行される更新プロセスがあり (単に performInBackground を使用するだけです)、その一部に db 更新があるため、バックグラウンド スレッド用に別の MOC があります。次に、didSave 通知を使用して変更をマージしますが、DB/UI にそれらの更新が表示されません。保存の前後にオブジェクト自体をログに記録しましたが、属性が変更されていることがわかりますが、通知によって呼び出されたメソッドでは、受信したコンテキストでオブジェクトをログに記録し、値が更新されていません。他にもおそらく醜いものがあることは知っていますが、このコアデータを理解しようとしているだけです。以前は MOC が 1 つしかなく、機能していました (非コア データは問題ないはずです) が、現在はバックグラウンドで再設計されており、別の MOC のガイダンスを使用したいと考えていました。
コンテキストを作成し、通知を設定し、属性を設定して保存します。保存後、値は 0 です
// this creates context with same PSC as main MOC
NSManagedObjectContext *context = [[MyAppDelegate application] temporaryContext];
[[NSNotificationCenter defaultCenter] addObserver:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]
selector:@selector(managedObjectContextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:context];
NSLog(@"value is %d", [[myObject email] boolValue]); //value is 1
[myObject setEmail:[NSNumber numberWithBool:![[myObject email] boolValue]]];
NSError *error;
if (![context save:&error]) {
NSLog(@"Error in saving BriefCase object - error:%@" ,error);
}
NSLog(@"value is %d", [[myObject email] boolValue]); //value is 0 now
ここで、送信された MOC を確認すると、すべての値が 1 であることがわかります。したがって、マージが発生しても、更新は行われません。保存後にオブジェクトが 0 になっている場合、切断はどこにありますか?
// Called when a ManagedObjectContext performs save operation
- (void)managedObjectContextDidSave:(NSNotification *)notification {
NSManagedObjectContext *receivedMOC = [notification object];
NSArray *items = [MyObjectClass getAllMyObjectsInManagedObjectContext:receivedMOC];
for (int i=0; i < [items count]; i++) {
NSLog(@"value is %d", [[[items objectAtIndex:i] email] boolValue]);
}
追加のコンテキスト作成コードが問題になる可能性があります
- (NSManagedObjectContext *)temporaryContext {
NSManagedObjectContext *newContext = [[[NSManagedObjectContext alloc] init] autorelease];
NSPersistentStoreCoordinator *psc = [self.managedObjectContext persistentStoreCoordinator];
[newContext setUndoManager:nil];
[newContext setPersistentStoreCoordinator:psc];
return newContext;