CoreData:注释:无法在路径上加载优化模型(Xcode 11-> iOS 12)

时间:2019-07-05 15:28:27

标签: ios core-data xcode11

在iOS 12设备上使用Xcode 11(测试版3)构建和运行Core Data项目(使用Xcode 10创建)时,我得到警告:

  

CoreData:注释:无法在路径上加载优化的模型   '/var/containers/Bundle/Application/7908B3F7-66BC-4931-A578-6A740CBFB37D/TestOMO.app/TestOMO.momd/TestOMO.omo'

如果没有警告

  • 我在iOS 12设备上使用Xcode 10构建并运行它
  • 我在iOS 13设备上使用Xcode 11构建并运行它

我的应用程序似乎运行正常,并且没有崩溃,因此我不确定收到此警告的重视程度。尽管如此,我当然希望摆脱它。

有很多与此核心数据注释相关的帖子,但大多数与Google Maps相关或未答复。

我创建了一个新项目,以消除与我自己的项目有关的问题的其他原因,并使其易于重现,如下所示:

  1. 使用Xcode 10(单视图应用程序,使用核心数据)创建一个新项目
  2. 在AppDelegate.swift中,添加 打印(“ psc =(persistentContainer)”) 来执行应用程序(_,didFinishLaunchingWithOptions :) (仅用于强制执行惰性var初始化)
  3. 在iOS12设备上构建并运行:没有问题
  4. 在Xcode 11中打开相同的项目,在iOS13设备上构建并运行:没有问题
  5. 在Xcode 11中构建并在iOS12设备上运行:您将收到上面引用的警告

清理构建文件夹或删除派生数据没有帮助。

2 个答案:

答案 0 :(得分:0)

由于@ChaitanyaKhurana上面的评论中的提示,我得以解决此问题。

这是我实现的快速代码,代替了原来的单行

let container = NSPersistentContainer(name: "ModelName")

需要一部分代码来检索模型版本字符串(从.momd包中的.plist文件),以避免每次有新的模型版本时都必须更新代码。

请注意,新代码/替代代码仅在13.0之前的iOS版本上执行,因为在iOS 13上没有问题。

let modelName = "ModelName"

var container: NSPersistentContainer!

if #available(iOS 13.0, *) {
    container = NSPersistentContainer(name: modelName)
} else {
    var modelURL = Bundle(for: type(of: self)).url(forResource: modelName, withExtension: "momd")!
    let versionInfoURL = modelURL.appendingPathComponent("VersionInfo.plist")
    if let versionInfoNSDictionary = NSDictionary(contentsOf: versionInfoURL),
        let version = versionInfoNSDictionary.object(forKey: "NSManagedObjectModel_CurrentVersionName") as? String {
        modelURL.appendPathComponent("\(version).mom")
        let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)
        container = NSPersistentContainer(name: modelName, managedObjectModel: managedObjectModel!)
    } else {
        //fall back solution; runs fine despite "Failed to load optimized model" warning
        container = NSPersistentContainer(name: modelName)
    }
}

答案 1 :(得分:0)

由于较旧的代码通常可以在Objective C中使用,因此这是一个ObjC版本(此代码来自@Lobo的答案):

- (NSPersistentContainer *)samplePersistentContainer {
    // The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
    @synchronized (self) {

        if (_persistentContainer == nil) {

            NSString *modelName = @"ModelName";

            if (@available(iOS 13, *)) {

                _persistentContainer = [NSPersistentContainer persistentContainerWithName: modelName];
                [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
                    if (error != nil) {
                        NSLog(@"Unresolved error %@, %@", error, error.userInfo);
                        abort();
                    }
                }];

            } else {

                NSString *modelURLPath = [[NSBundle mainBundle] pathForResource: modelName ofType: @"momd"];

                NSURL *modelURL = [NSURL fileURLWithPath: modelURLPath];

                NSURL *versionInfoURL = [modelURL URLByAppendingPathComponent: @"VersionInfo.plist"];

                NSDictionary *versionInfoNSDictionary = [NSDictionary dictionaryWithContentsOfURL: versionInfoURL];

                NSString *version = versionInfoNSDictionary[@"NSManagedObjectModel_CurrentVersionName"];

                modelURL = [modelURL URLByAppendingPathComponent:[NSString stringWithFormat: @"%@.mom", version]];

                NSManagedObjectModel *mod = [[NSManagedObjectModel alloc] initWithContentsOfURL: modelURL];

                _persistentContainer = [NSPersistentContainer persistentContainerWithName: modelName managedObjectModel: mod];
            }
        }
    }

    return _persistentContainer;
}