Cocoa touch iOS 7中未触发NSManagedObjectContextDidSaveNotification
我在主线程中对NSManagedObject的属性进行了一些更改。它属于应用程序的主ManagedObjectContext 我的应用程序确实启用了线程,可以下载数据,每个线程都有自己的ManagedObjectContext,它是从整个应用程序中单个PersistentStore的最新状态创建的 我正在实现Cocoa touch iOS 7中未触发NSManagedObjectContextDidSaveNotification,cocoa-touch,cocoa,core-data,nsmanagedobject,nsmanagedobjectcontext,Cocoa Touch,Cocoa,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我在主线程中对NSManagedObject的属性进行了一些更改。它属于应用程序的主ManagedObjectContext 我的应用程序确实启用了线程,可以下载数据,每个线程都有自己的ManagedObjectContext,它是从整个应用程序中单个PersistentStore的最新状态创建的 我正在实现NSManagedObjectContextDidSaveNotification,这样MOC中的任何更改都会合并回主线程的MOC。下面是它的代码: - (void)backgroundMO
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
调用-backgroundmocdisave:
- 当我不修改ManagedObject的任何属性,只对其MOC执行
操作时,会触发通知-save
-save
调用时,将触发通知NSManagedObject ContextDidSaveNotification
以前有人遇到过这个问题吗?现在我注意到一件事是错的,但我不确定是它导致了你的错误
NSManagedObjectContextDidSaveNotification
在调用save
的MOC正在运行的线程上发送。但是合并应该在运行MOC合并更改的线程上进行。在您的情况下,如果将更改从后台合并到主MOC,效果很好,但不是相反。您的后台上下文是独立于主上下文还是嵌套于主上下文?不,所有上下文都是从单个持久存储创建的。这就是为什么我将所有上下文中的更改合并到将写入存储的主上下文中。如何检查是否触发了backgroundmocdisave:
?我启用了断点。在iOS 6中,当我在MOC上调用-save时,这个断点出现了,但在iOS 7中却没有。是的,你提到的只是我的观点的一个断言。这里的实现有什么问题吗?DidSave通知应该在主MOC上触发,因为它将(已经)写入持久存储,不是吗?我仔细看了一下,发现您的实现无法处理从主MOC到后台MOC的合并更改。您需要另一种方法,例如mainmodisave
。然后,您必须根据上下文更改对通知的订阅。而不是对象:nil]代码>您应该有两个订阅:对象:self.managedObjectContext]代码>和对象:self.backgroundManagedObjectContext]好的,我现在明白你的意思了。除了主线程中的主MOC之外,我还为每个线程创建MOC。因此,线程MOC不会长久存在。当我从服务器获取所有数据时,我确保我仅在为线程创建MOC之后才在主MOC上调用-save,这确保线程的MOC是从持久存储的最新状态创建的。但对我来说,问题不在次要线程中,而是MOC。在这里,当我执行-save操作时,对主MOC的ManagedObject所做的更改不会触发NSManagedObjectContextDidSaveNotification。是的,我不知道为什么会发生这种情况。您是否在保存主主主运行中心时检查错误?谢谢,我没有检查保存错误。它是放弃冲突。然而,这让我想到了另一个问题,其他人已经发布了:但这可以标记为已解决,谢谢。