framework中加载资源(CoreData)

一开始项目中使用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就可以读取了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容