我有一种情况,我在主线程中对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:
-save
时,-backgroundMOCDidSave:
调用未被触发-save
操作时会触发通知相同的代码在iOS 6中运行良好。无论是否对ManagedObject进行任何更改,当在其MOC上触发-save
调用时,通知NSManagedObjectContextDidSaveNotification
都会被触发。
之前有人遇到过这个问题吗?
答案 0 :(得分:1)
现在我注意到有一件事是错的,但我不确定是不是会导致你的错误。 NSManagedObjectContextDidSaveNotification
在调用save
的MOC正在运行的线程上发送。但是应该在MOC合并更改正在运行的线程上进行合并。在你的情况下,如果将更改从背景合并到主MOC,它可以正常工作,但不是相反。