Cocoa touch iOS 7中未触发NSManagedObjectContextDidSaveNotification

Cocoa touch iOS 7中未触发NSManagedObjectContextDidSaveNotification,cocoa-touch,cocoa,core-data,nsmanagedobject,nsmanagedobjectcontext,Cocoa Touch,Cocoa,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我在主线程中对NSManagedObject的属性进行了一些更改。它属于应用程序的主ManagedObjectContext 我的应用程序确实启用了线程,可以下载数据,每个线程都有自己的ManagedObjectContext,它是从整个应用程序中单个PersistentStore的最新状态创建的 我正在实现NSManagedObjectContextDidSaveNotification,这样MOC中的任何更改都会合并回主线程的MOC。下面是它的代码: - (void)backgroundMO

我在主线程中对NSManagedObject的属性进行了一些更改。它属于应用程序的主ManagedObjectContext

我的应用程序确实启用了线程,可以下载数据,每个线程都有自己的ManagedObjectContext,它是从整个应用程序中单个PersistentStore的最新状态创建的

我正在实现
NSManagedObjectContextDidSaveNotification
,这样MOC中的任何更改都会合并回主线程的MOC。下面是它的代码:

- (void)backgroundMOCDidSave:(NSNotification*)notification
{
    // Probable fix for: http://stackoverflow.com/questions/3446983/collection-was-mutated-while-being-enumerated-on-executefetchrequest
    if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(backgroundMOCDidSave:) withObject:notification waitUntilDone:YES];
        return;
    }

    // We merge the background moc changes in the main moc
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
注册此通知:

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(backgroundMOCDidSave:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:nil];
但iOS 7中出现了奇怪的事情。我正在访问从主MOC创建的NSManagedObject:

  • 当我修改属于主MOC(主线程)的ManagedObject的属性并执行
    -save
    时,不会触发
    -backgroundmocdisave:
    调用
  • 当我不修改ManagedObject的任何属性,只对其MOC执行
    -save
    操作时,会触发通知
同样的代码在iOS 6中运行得非常好。无论是否对ManagedObject进行了任何更改,当在其MOC上触发
-save
调用时,将触发通知
NSManagedObject ContextDidSaveNotification


以前有人遇到过这个问题吗?

现在我注意到一件事是错的,但我不确定是它导致了你的错误
NSManagedObjectContextDidSaveNotification
在调用
save
的MOC正在运行的线程上发送。但是合并应该在运行MOC合并更改的线程上进行。在您的情况下,如果将更改从后台合并到主MOC,效果很好,但不是相反。

您的后台上下文是独立于主上下文还是嵌套于主上下文?不,所有上下文都是从单个持久存储创建的。这就是为什么我将所有上下文中的更改合并到将写入存储的主上下文中。如何检查是否触发了
backgroundmocdisave:
?我启用了断点。在iOS 6中,当我在MOC上调用-save时,这个断点出现了,但在iOS 7中却没有。是的,你提到的只是我的观点的一个断言。这里的实现有什么问题吗?DidSave通知应该在主MOC上触发,因为它将(已经)写入持久存储,不是吗?我仔细看了一下,发现您的实现无法处理从主MOC到后台MOC的合并更改。您需要另一种方法,例如
mainmodisave
。然后,您必须根据上下文更改对通知的订阅。而不是
对象:nil]您应该有两个订阅:
对象:self.managedObjectContext]
对象:self.backgroundManagedObjectContext]