【发布时间】:2013-10-13 16:50:42
【问题描述】:
我有一种情况,我在主线程中对 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。
以前有人遇到过这个问题吗?
【问题讨论】:
-
你的背景上下文是独立于主上下文还是嵌套在主上下文中?
-
不,所有上下文都是从单个持久存储创建的。这就是为什么我将所有上下文的更改合并到将写入存储的主上下文中。
-
如何检查
backgroundMOCDidSave:是否被触发? -
我启用了断点。当我在 iOS 6 的 MOC 上调用 -save 时会遇到此断点,但在 iOS 7 中没有发生。
标签: cocoa-touch cocoa core-data nsmanagedobject nsmanagedobjectcontext