framework中加载资源(CoreData)

2020-10-17  本文已影响0人  点点_星光

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

上一篇 下一篇

猜你喜欢

热点阅读