【问题标题】:CoreData: annotation: Failed to load optimized model at path (Xcode 11 -> iOS 12)CoreData:注释:无法在路径加载优化模型(Xcode 11 -> iOS 12)
【发布时间】:2019-11-16 06:01:15
【问题描述】:

在 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 构建并运行它

我的应用程序似乎运行良好,并且没有崩溃,所以我不确定如何认真对待这个警告。尽管如此,我肯定更愿意摆脱它。

有很多帖子与此 Core Data 注释相关,但大多数要么与 Google 地图相关,要么没有得到答复。

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

  1. 使用 Xcode 10(单一视图应用程序,使用核心数据)创建一个新项目
  2. 在 AppDelegate.swift 中,添加 print ("psc = (persistentContainer)") to func application(_ , didFinishLaunchingWithOptions:) (只是为了强制惰性 var 初始化)
  3. 在 iOS12 设备上构建和运行:没问题
  4. 在 Xcode 11 中打开同一个项目,在 iOS13 设备上构建和运行:没问题
  5. Sill 在 Xcode 11 中,在 iOS12 设备上构建和运行:您将收到上面引用的警告

清理构建文件夹或删除派生数据无济于事。

【问题讨论】:

  • 我有同样的问题。你找到解决办法了吗?
  • @ChaitanyaKhurana 很遗憾没有
  • NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"momd"]; // 解决 omo 问题的小技巧 modelURL = [modelURL URLByAppendingPathComponent:@"test 24.mom"]; 我使用名称 'test' 而不是真正的应用程序名称。试试这个,它对我有用! @Lobo
  • here已经解决了同样的问题
  • @ChaitanyaKhurana 感谢您的提示。我现在已经在下面发布了一个全面的答案。

标签: ios core-data xcode11


【解决方案1】:

感谢@ChaitanyaKhurana 上面评论中的提示,我能够解决这个问题。

这是我实现的swift代码,替换了原来的单行

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)
    }
}

【讨论】:

    【解决方案2】:

    由于较旧的代码通常可以在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2018-04-04
      • 1970-01-01
      • 2018-04-03
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多