0

我有一种情况,我在主线程中对 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 的任何属性而只-save对其 MOC 执行操作时,将触发通知

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

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

4

1 回答 1

1

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

于 2013-10-07T09:07:18.000 回答