NSPersistentContainer失败,没有错误

时间:2016-09-24 17:47:01

标签: objective-c macos nsmanagedobjectcontext xcode8

我突然被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"; }

数据库创建失败的原因尚不清楚:无论是否进行代码签名都会发生。我已经制作了错误报告,并且我已经开通了支持请求。

1 个答案:

答案 0 :(得分:2)

当我升级到Sierra(MacOS 10.12)时,NSPersistentContainer开始失败 错误。因此,您可以在MacOS 10.11上运行的Xcode 8中实现NSPersistentContainer,您的项目将编译并运行,但NSPersistentContainer不会蹲下。我已经提交了一个错误报告,我希望Apple会在课程中添加预处理程序指令,但是他们似乎并不感兴趣。