ios - 后台核心数据 : Using separate context and notifications, 但未使用新值更新数据库

标签 ios multithreading core-data concurrency

概述:我有一个在后台运行的刷新进程(仅使用 performInBackground 即可),其中一部分有数据库更新,因此我有一个单独的 MOC 用于后台线程。然后我使用 didSave 通知合并更改,但我没有在数据库/我的 UI 中看到这些更新。我在保存之前和之后记录了对象本身,我可以看到属性已更改,但是在通知调用的方法中,我在收到的上下文中记录对象并且它没有更新的值。我知道其他一些东西可能很难看,但只是想弄清楚这个核心数据。我以前只有一个 MOC,一切正常(非核心数据应该没问题),但我现在重新设计了一些东西在后台,并想使用一个单独的 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;

最佳答案

temporaryContext 在每次调用时都会创建一个新的 MOC,因此看起来您实际上使用了 2 个不同的后台 MOC。 myModel 是在与

不同的 MOC 上创建的
NSManagedObjectContext *context = [[MyAppDelegate application] temporaryContext];

因此保存后者不会影响 myModel 中的更改。

您必须修改代码,以便仅创建并传递一个临时上下文。

关于ios - 后台核心数据 : Using separate context and notifications, 但未使用新值更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301463/

相关文章:

ios - 删除带有 CoreData 和 NSFetchedResultsController 的 UITableView 行

.net - RegisterWaitForSingleObject 与 AutoResetEvent

c - 如何编译 POSIX 定时器

ios - 验证 iOS 屏幕是否存在用户错误

ios - 核心数据和版本控制

ios - SpriteKit 中的完成 block 从未被调用

ios - 在两个 UINavigationController 之间导航

ios - UITableViewCell + 动态高度 + 自动布局

c# - worker线程加入BindingList时跨线程操作异常

ios - Objective -C 类问题