我突然被managedObjectContexts形式的核心数据问题所困扰,这些问题只有三分之二的时间:起始或多或少与升级到Xcode 8一致。新的NSPersistentContainer类似乎提供了一个机会解决我的问题,摆脱一些丑陋的代码。不幸的是,我无法使其发挥作用。
在AppDelegate.h中
@property (readonly, strong, nonatomic) NSPersistentContainer *persistentContainer;
在AppDelegate.m中:
@synthesize persistentContainer = _persistentContainer;
- (NSPersistentContainer *)persistentContainer
{
if (!_persistentContainer) {
_persistentContainer = [NSPersistentContainer persistentContainerWithName:@"I_WILL_PERSIST"];
__block BOOL storesWereLoaded = NO;
[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *psd, NSError *error) {
if (error) {
NSLog(@"loadPersistentStoresWithCompletionHandler: persistent container could not load store %@. Error: %@",
psd, error.debugDescription);
} else {
storesWereLoaded = YES;
}
}];
if (storesWereLoaded) {
NSLog(@"Stores were loaded");
} else {
NSLog(@"Stores were not loaded");
}
}
return _persistentContainer;
}
该应用程序是一个小测试应用程序,其中arrayController绑定(在IB中)到App Delegate.persistentContainer.viewContext。 App Delegate已连接,不是nil。重复调用persistentContainer getter,但块中的NSLog永远不会触发,控制台显示:
如果没有托管对象上下文,则无法执行操作2016-09-24 19:34:39.207 I_WILL_PERSIST [5588:180829](0 CoreFoundation
0x00007fff8da994f2 __exceptionPreprocess + 178 1 libobjc.A.dylib
0x00007fff8ed6173c objc_exception_throw + 48 2 CoreFoundation
0x00007fff8db004bd + [NSException raise:format:] + 205 3 AppKit
0x00007fff85d411c4 - [_ NSManagedProxy _managedObjectContext] + 66
问题出在我不稳定的编程技巧上吗?是签名/权限问题(应用程序不是沙盒,自动代码签名)?什么突然与Core Data有什么关系?
==== EDIT ==== 升级到Mac OS 10.12(Sierra)后,NSPersistentContainer失败并出现错误:
2016-09-28 20:55:53.256588 osPersist[1936:41151] [error] error:
-addPersistentStoreWithType:SQLite configuration:(null) URL:file:///Users/user/Library/Application%20Support/osPersist/osPersist.sqlite options:{
NSInferMappingModelAutomaticallyOption = 1;
NSMigratePersistentStoresAutomaticallyOption = 1; } ... returned error Error Domain=NSCocoaErrorDomain Code=512 "The file couldn’t be saved." UserInfo={reason=Failed to create file; code = 2} with userInfo dictionary {
reason = "Failed to create file; code = 2"; } 2016-09-28 20:55:53.256747 osPersist[1936:41151] Unresolved error Error Domain=NSCocoaErrorDomain Code=512 "The file couldn’t be saved." UserInfo={reason=Failed to create file; code = 2}, {
reason = "Failed to create file; code = 2"; }
数据库创建失败的原因尚不清楚:无论是否进行代码签名都会发生。我已经制作了错误报告,并且我已经开通了支持请求。
答案 0 :(得分:2)
当我升级到Sierra(MacOS 10.12)时,NSPersistentContainer开始失败 错误。因此,您可以在MacOS 10.11上运行的Xcode 8中实现NSPersistentContainer,您的项目将编译并运行,但NSPersistentContainer不会蹲下。我已经提交了一个错误报告,我希望Apple会在课程中添加预处理程序指令,但是他们似乎并不感兴趣。