Iphone 核心数据后台线程NSManagedObjectContext合并错误
我正在编写一个Ipad应用程序,它在一个单独的操作队列中显示文章和下载新文章,并将它们插入核心数据。目前,我有一个单独的操作上下文,在操作的主方法中创建,并使用与主上下文相同的协调器。我使用的模式与建议在该操作中多次侦听NSManagedObjectContextDidSaveNotification的模式相同,然后在主线程上下文上调用mergeChangesFromContextDidSaveNotification。问题是我遇到了以下错误:Iphone 核心数据后台线程NSManagedObjectContext合并错误,iphone,objective-c,ipad,ios,core-data,Iphone,Objective C,Ipad,Ios,Core Data,我正在编写一个Ipad应用程序,它在一个单独的操作队列中显示文章和下载新文章,并将它们插入核心数据。目前,我有一个单独的操作上下文,在操作的主方法中创建,并使用与主上下文相同的协调器。我使用的模式与建议在该操作中多次侦听NSManagedObjectContextDidSaveNotification的模式相同,然后在主线程上下文上调用mergeChangesFromContextDidSaveNotification。问题是我遇到了以下错误: 2011-01-27 07:26:02.574 Z
2011-01-27 07:26:02.574 Zagazine[12298:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'
*** Call stack at first throw:
(
0 CoreFoundation 0x3284b987 __exceptionPreprocess + 114
1 libobjc.A.dylib 0x31aca49d objc_exception_throw + 24
2 CoreData 0x3549d07b _PFRetainedObjectIDCore + 638
3 CoreData 0x3549cdfb - [NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:] + 14
4 CoreData 0x354bf85b -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 2170
5 CoreFoundation 0x327e9bbf -[NSObject(NSObject) performSelector:withObject:] + 22
6 Foundation 0x320fd795 __NSThreadPerformPerform + 268
7 CoreFoundation 0x328017dd __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
8 CoreFoundation 0x327d34fb __CFRunLoopDoSources0 + 194
9 CoreFoundation 0x327d2e5b __CFRunLoopRun + 230
10 CoreFoundation 0x327d2c87 CFRunLoopRunSpecific + 230
11 CoreFoundation 0x327d2b8f CFRunLoopRunInMode + 58
12 GraphicsServices 0x3094a4ab GSEventRunModal + 114
13 GraphicsServices 0x3094a557 GSEventRun + 62
14 UIKit 0x32c14329 -[UIApplication _run] + 412
15 UIKit 0x32c11e93 UIApplicationMain + 670
16 ArticleApp 0x0000233f main + 70
17 ArticleApp 0x000022f4 start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal: “SIGABRT”.
有趣的是,这个错误只在我安装应用程序后第一次启动应用程序时发生。安装后的所有后续启动都可以正常工作。有人知道为什么会发生此错误,以及为什么只有在初始安装时才会发生此错误吗
另外,这也是我合并上下文的方式,当后台线程接收到通知时,会对其进行调用:
- (void)mergeChanges:(NSNotification *)notification {
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
}
有趣的是,这个错误只在我安装应用程序后第一次启动应用程序时发生。安装后的所有后续启动都可以正常工作。有人知道为什么会发生此错误,以及为什么只有在初始安装时才会发生此错误吗
我猜在第一次启动时,持久性存储没有正确地与磁盘上的文件关联。将支持核心数据存储的文件的URL分配给持久存储协调器时,该文件不会具体化。它只有在第一次保存时才具体化
在没有准备好备份文件的情况下合并更改会导致很多问题
在创建后台线程之前,在执行的很早的时候,当核心数据上下文仍然为空时,尝试在第一次启动时从主线程保存一次上下文。希望这能解决您的问题。您是否有任何其他上下文观察到的来自ContextDidSaveNotification的任何其他
合并更改?如果是这样的话,它可能是您正在通知的订单。它可能是在通知不知道更改所影响的架构的上下文(也称为“无法从此NSManagedObjectContext的协调器访问对象的持久存储”)。是的,这是可行的,我在应用程序启动时添加了代码,在任何其他背景内容发生之前删除了所有对象,它做到了这一点。这正常吗?我的设计有什么问题吗?我目前让它在应用程序中启动同步操作队列:didFinishLaunchingWithOptions,用于下载数据和插入。保存时不必删除对象。当我说当核心数据上下文为空时应该保存一次时,我的意思是,当程序安装到给定设备上后第一次启动时,应该在最开始时保存。你的设计对我来说非常合适。只是从后台线程访问核心数据是。。。棘手的我删除这些对象纯粹是为了测试,我从Web服务下载json并插入到我的存储中,所以我喜欢更改json数据来测试它。很抱歉给你带来困惑,谢谢你的回答+1+1表示良好的“猜测”。在第一次启动或删除持久存储文件后立即调用save:
,为我修复了错误。谢谢