When building and running a Core Data project (created with Xcode 10) using Xcode 11 (beta 3) on an iOS 12 device, I get the warning:
CoreData: annotation: Failed to load optimized model at path '/var/containers/Bundle/Application/7908B3F7-66BC-4931-A578-6A740CBFB37D/TestOMO.app/TestOMO.momd/TestOMO.omo'
There is no warning if
My app seems to work fine and there are no crashes, so I am not sure how seriously to take this warning. Nonetheless I would surely prefer to get rid of it.
There are many posts related to this Core Data annotation, but most are either related to Google Maps or are unanswered.
I have created a new project to eliminate other causes for the issue related to my own project and to make it easy to reproduce as follows:
Cleaning the build folder or deleting derived data is of no help.
I was able to solve the issue thanks to the hint in @ChaitanyaKhurana's comment above.
Here is the swift code I have implemented, replacing the original single line
let container = NSPersistentContainer(name: "ModelName")
Part of the code is needed to retrieve the model version string (from the .plist file located in the .momd package) in order to avoid having to update the code each time there is a new model version.
Please also note that the new/alternative code only executes on iOS versions prior to 13.0 as there is not issue on 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)
}
}
Since older code can often be in Objective C, here's an ObjC version (this is sourced on the answer from @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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With