我正在编写一个Ipad应用程序,该应用程序在队列中的单独NSOperation中显示文章并下载新文章,并将其插入到核心数据中。目前,我有一个单独的操作上下文,在操作的主方法中创建,并使用相同的协调器作为主上下文。我在NSManagedObjectContextDidSaveNotification的操作中使用了相同的模式,然后在主线程上下文中调用mergeChangesFromContextDidSaveNotification。问题是我收到了这个错误:
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];
}
答案 0 :(得分:17)
这个有趣的部分是这个错误只发生在我安装它后第一次启动应用程序时。安装后的所有后续发布都可以正常工作。有谁知道为什么会发生这种错误以及为什么它只会在初始安装时发生。
我的猜测是,在第一次启动时,持久存储未正确关联到磁盘上的文件。将URL分配给持久性存储协调器时,支持Core Data存储的文件不会实现。它仅在首次保存时实现。
在没有备份文件准备就绪的情况下合并更改会导致很多问题。
在创建后台线程之前,当Core Data上下文仍为空时,尝试在执行的早期第一次启动时从主线程保存上下文一次。希望这能解决您的问题。
答案 1 :(得分:0)
您是否在任何其他情况下观察到任何其他mergeChangesFromContextDidSaveNotification
通知?如果是这样,那可能是您通知的订单。它可能会通知上下文不知道更改正在影响的模式(也就是说,'对象的持久存储无法从此NSManagedObjectContext的协调器访问')。