【问题标题】:Changes saved from one NSManagedObjectContext doesn't reflect on main NSManagedObjectContext从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext
【发布时间】:2011-09-03 11:21:15
【问题描述】:

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

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

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

如果我退出并重新打开应用程序,所有更改都在那里。

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

在此方法之前,我使用单个 NSManagedObjectContextundoManager,但我想将其更改为使用两个不同的 NSManagedObjectContexts。

第二次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]);
        }
    }

【问题讨论】:

    标签: objective-c cocoa core-data nsmanagedobjectcontext


    【解决方案1】:

    如果您还没有这样做,我建议您阅读 Apple 文档 Core Data : Change Management.

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

    // 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!还有一篇关于 cocoanetics 的好文章,解释了如何使用多个上下文和核心数据,值得一读cocoanetics.com/2012/07/multi-context-coredata
    • handleDidSaveNotification 可以避免,而只是在 firstManagedObjectContext 上添加观察者,...addObserver: firstManagedObjectContext selector:@selector(mergeChangesFromContextDidSaveNotification:)...
    • 与 privateQueueConcurrencyType 完美配合。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2014-05-30
    • 2011-10-23
    • 2023-03-26
    相关资源
    最近更新 更多