Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从一个NSManagedObjectContext保存的更改不';不考虑主要NSManagedObjectContext_Objective C_Cocoa_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

Objective c 从一个NSManagedObjectContext保存的更改不';不考虑主要NSManagedObjectContext

Objective c 从一个NSManagedObjectContext保存的更改不';不考虑主要NSManagedObjectContext,objective-c,cocoa,core-data,nsmanagedobjectcontext,Objective C,Cocoa,Core Data,Nsmanagedobjectcontext,我有一个主NSManagedObjectContext,它是在appDelegate中创建的 现在,我正在使用另一个NSManagedObjectContext来编辑/添加新对象,而不影响主NSManagedObjectContext,直到保存它们 当我保存第二个NSManagedObjectContext时,更改不会反映在主NSManagedObjectContext中,但是如果我从模拟器打开.sqlite数据库,则更改已正确保存到.sqlite数据库中。无论我是否再次获取数据,或者即使我创建

我有一个主
NSManagedObjectContext
,它是在
appDelegate
中创建的

现在,我正在使用另一个
NSManagedObjectContext
来编辑/添加新对象,而不影响主
NSManagedObjectContext
,直到保存它们

当我保存第二个
NSManagedObjectContext
时,更改不会反映在主
NSManagedObjectContext
中,但是如果我从模拟器打开.sqlite数据库,则更改已正确保存到.sqlite数据库中。无论我是否再次获取数据,或者即使我创建了第三个
NSManagedObjectContext
,我都无法从第二个
NSManagedObjectContext
中看到这些更改,尽管此时磁盘上确实存在这些更改

如果我退出并重新打开应用程序,所有更改都会出现

什么会导致主
NSManagedObjectContext
看不到持久存储中的新更改

在此方法之前,我使用的是单个
NSManagedObjectContext
undoManager
,但我想将其更改为使用两个不同的
NSManagedObjectContext
s

第二个
NSManagedObjectContext
保存:

    NSError* error = nil;

    if ([managedObjectContext hasChanges]) {
        NSLog(@"This new object has changes");
    }

    if (![managedObjectContext save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

如果您还没有这样做,我建议您阅读上的苹果文档

您需要将通过第二个上下文保存的更改通知第一个上下文。保存上下文时,它会发布一个
NSManagedObjectContextDidSaveNotification
。注册该通知。在handler方法中,将通过第二个上下文保存的更改合并到第一个上下文中。例如:

// second managed object context save

// register for the notification
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
       selector:@selector(handleDidSaveNotification:)
           name:NSManagedObjectContextDidSaveNotification 
         object:secondManagedObjectContext];

// rest of the code ommitted for clarity
if (![secondManagedObjectContext save:&error]) {
    // ...
}

// unregister from notification
[[NSNotificationCenter defaultCenter] 
    removeObserver:self 
              name:NSManagedObjectContextDidSaveNotification 
            object:secondManagedObjectContext];
通知处理程序:

- (void)handleDidSaveNotification:(NSNotification *)note {
    [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
}

我认为NSManagedObjectContextDidSaveNotification不是必需的/强制性的,我读过其他帖子,对此我并不清楚。我会试试你的建议,然后再发一次。谢谢+1.此外,还有一篇关于协同论的好文章,解释了如何处理值得阅读的多个上下文和核心数据。可以避免避免重复通知,而只需在firstManagedObjectContext上添加观察者,…addObserver:firstManagedObjectContext选择器:@selector(mergeChangesFromContextDidSaveNotification:)…也适用于privateQueueConcurrencyType。谢谢