一开始项目中使用coredata保存数据,自己写了一个单例管理。其中获取CoreData.momd文件:
- (NSManagedObjectModel *)manageObjectModel {
if (_manageObjectModel != nil) {
return _manageObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:kDDCoreDataManagerModelName withExtension:@"momd"];
/*
if(@available(iOS 11.0, *)){
} else {
modelURL = [modelURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mom", kDDCoreDataManagerModelName]];
}*/
_manageObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _manageObjectModel;
}
随后coredata转移到SDK中,打包framework之后直接闪退,定位到_manageObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];意思是modelURL为nil,无法加载空的。
通过和之前的对比,发现是无法找到CoreData.momd文件,查看.framework内容CoreData.momd存在里面。
image.png
剩下的就是从.framework查找CoreData.momd路径,之前代码是用mainBundle,此次通过-bundleForClass:方法获取bundle。代码更新如下
- (NSManagedObjectModel *)manageObjectModel {
if (_manageObjectModel != nil) {
return _manageObjectModel;
}
//NSURL *modelURL = [[NSBundle mainBundle] URLForResource:kDDCoreDataManagerModelName withExtension:@"momd"];
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *modelURL = [bundle URLForResource:kDDCoreDataManagerModelName withExtension:@"momd"];
/*
if(@available(iOS 11.0, *)){
} else {
modelURL = [modelURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mom", kDDCoreDataManagerModelName]];
}*/
if (modelURL) {
_manageObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
return _manageObjectModel;
}
同理获得其他的资源,只要获取到bundle就可以读取了。
网友评论