gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:34:58 25 4
gpt4 key购买 nike

概述:我有一个在后台运行的刷新进程(仅使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com