在主线程中,我对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中发生了一些奇怪的事情。我正在访问一个NSManagedObject,它是从主MOC创建的:
-save时,不会触发-backgroundMOCDidSave:调用。-save操作时,就会触发通知。同样的代码在iOS 6中运行得很好,无论是否在ManagedObject上进行任何更改,当在其MOC上触发-save调用时,通知NSManagedObjectContextDidSaveNotification都会被触发。
以前有人遇到过这个问题吗?
发布于 2013-10-07 09:07:18
现在我注意到一件事情是错误的,但我不确定它是否导致了你的错误。NSManagedObjectContextDidSaveNotification是在调用save的线程上发送的。但是合并应该在MOC正在运行的线程上进行。在您的示例中,如果将更改从背景合并到主MOC,则工作正常,而不是相反。
https://stackoverflow.com/questions/19219340
复制相似问题