0

概要: バックグラウンドで実行される更新プロセスがあり (単に 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;
4

2 に答える 2

1

temporaryContext呼び出しごとに新しい MOC を作成するため、実際には 2 つの異なるバックグラウンド MOC を使用しているようです。myModelとは異なる MOC で作成されます

NSManagedObjectContext *context = [[MyAppDelegate application] temporaryContext];

したがって、後者を保存しても の変更には影響しませんmyModel

一時的なコンテキストが 1 つだけ作成されて渡されるように、コードを変更する必要があります。

于 2013-10-10T19:45:36.203 に答える
0

私はあなたが電話しているのを見ません

[mainMOC mergeChangesFromContextDidSaveNotification:saveNotification];

通知を処理するとき。これは、何が起こっているのかを説明するかもしれません。これは、メイン スレッドで呼び出す必要があります。

于 2013-10-10T16:42:32.717 に答える