【发布时间】:2014-01-21 17:29:22
【问题描述】:
感谢阅读。我们收到了关于我们的 iOS 应用程序的崩溃报告,其中包含以下错误:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
这发生在我们的主队列 NSManagedObjectContext 尝试保存时:
BOOL saved = [managedObjectContext save:&error];
这发生在通过以下方式提交的块中:
[managedObjectContext performBlockAndWait:saveBlock];
互联网(尤其是 SO)对这个错误充满了解释,表明我们从来没有持久存储协调器(我们在构建核心数据堆栈时未能正确创建它)。但是,如果没有持久存储协调器,我们很难在程序执行中达到这一点。为了好玩,我注释掉了我们设置持久存储的行,应用程序几乎立即崩溃(没有进入我们的保存方法)。
有谁知道这个异常是否有其他原因,或者是否总是因为没有持久存储?有什么方法可以丢失持久性存储?
更多颜色:我们使用父/子 NSManagedObjectContexts 以便在后台线程中加载数据。完整的保存方法如下所示:
-(void)saveWithManagedObjectContext:(NSManagedObjectContext*)managedObjectContext successHandler:(void (^)())successHandler failureHandler:(void (^)(NSManagedObjectContext* managedObjectContext, NSError*))failureHandler
{
void(^saveBlock)() = ^() {
NSError *error = nil;
BOOL saved = [managedObjectContext save:&error];
if (!saved) {
if (error != nil) {
NSLog(@"Unresolved error saving %@, %@", error, [error userInfo]);
}
failureHandler(managedObjectContext, error);
} else {
if (managedObjectContext.parentContext != nil) {
[self saveWithManagedObjectContext: managedObjectContext.parentContext successHandler:successHandler failureHandler:failureHandler];
} else {
successHandler();
}
}
};
BOOL isMainContext = managedObjectContext.parentContext == nil;
if (isMainContext) {
[managedObjectContext performBlockAndWait:saveBlock];
} else {
[managedObjectContext performBlock:saveBlock];
}
}
它可以从后台线程调用,该线程将通过 performBlock: 在 NSManagedObjectContext 上调用 save:,然后在父 NSManagedObjectContext 上递归调用此方法以保存它。当应用程序崩溃时,它总是在主线程上,这是有道理的,因为主队列上下文是唯一需要持久存储的上下文。
非常感谢您的帮助。我确实在 devforums.apple.com 上发过帖子,所以如果您看到了两次,我深表歉意。
【问题讨论】:
标签: core-data