在iOS 7中未触发NSManagedObjectContextDidSaveNotification

时间:2013-10-07 07:39:22

标签: cocoa-touch cocoa core-data nsmanagedobject nsmanagedobjectcontext

我有一种情况,我在主线程中对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时,-backgroundMOCDidSave:调用未被触发
  • 当我不修改ManagedObject的任何属性并且只对其MOC执行-save操作时会触发通知

相同的代码在iOS 6中运行良好。无论是否对ManagedObject进行任何更改,当在其MOC上触发-save调用时,通知NSManagedObjectContextDidSaveNotification都会被触发。

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

1 个答案:

答案 0 :(得分:1)

现在我注意到有一件事是错的,但我不确定是不是会导致你的错误。 NSManagedObjectContextDidSaveNotification在调用save的MOC正在运行的线程上发送。但是应该在MOC合并更改正在运行的线程上进行合并。在你的情况下,如果将更改从背景合并到主MOC,它可以正常工作,但不是相反。

相关问题