fmdb- 封装的第一步解析modelClass

@interface JCF_FMDBRunTimeModelInterface : NSObject{
    Class _modelClass;
}
- (instancetype)initWithModelClassName:(NSString *)className;
/*
 * 主键的属性名
 */
@property (nonatomic,strong)NSString *mainKeyPropertyName;
@property (nonatomic,strong)NSArray *modelPropertyNameArray;
@property (nonatomic,assign)BOOL haveModelArrayProperty;
@property (nonatomic,assign)BOOL haveModelProperty;
/*
 * NSDictionary <NSString *,NSString *> 中
 * propertyModelClassName model的class string
 * propertyName 对应的属性名字
 */
@property (nonatomic,strong)NSArray <NSDictionary <NSString *,NSString *>*>* modelArrayPropertyArray;
@property (nonatomic,strong)NSArray <NSDictionary <NSString *,NSString *>*>* modelPropertyArray;

@end

@implementation JCF_FMDBRunTimeModelInterface
- (instancetype)initWithModelClassName:(NSString *)className{
    if (self = [super init]) {
        _modelClass = NSClassFromString(className);
    }
    return self;
}

- (NSString *)mainKeyPropertyName{
    if ([_modelClass respondsToSelector:@selector(mainKey)]) {//相应类方法
        return [_modelClass mainKey];
    }
    NSString *mainKey = [[[_modelClass alloc] init] mainKey];
    if (mainKey.length == 0) {
        JCF_Exception(NSStringFromClass(_modelClass),@"必须至少实现一个获取主键的方法")
    }
    return mainKey;
}

- (BOOL)haveModelProperty{
    return self.modelPropertyArray.count != 0;
}

- (BOOL)haveModelArrayProperty{
    return self.modelArrayPropertyArray.count != 0;
}

- (Class)propertyClassBy:(SEL)selector{
    // 下面这段代码抄自Mantle 方法实现的调用~
    IMP imp = [_modelClass methodForSelector:selector];
    Class (*function)(id, SEL) = (__typeof__(function))imp;
    Class class = function(_modelClass, selector);
    return class;
}

- (NSArray<NSDictionary<NSString *,NSString *> *> *)modelPropertyArray{
    if (!_modelPropertyArray) {
        NSMutableArray *modelPropertyArray = [NSMutableArray array];
        for (NSString *propertyNameString in self.modelPropertyNameArray) {
            NSString *selectorString = [NSString stringWithFormat:@"%@JCFModel",propertyNameString];
            SEL selector =  NSSelectorFromString(selectorString);
            if ([_modelClass respondsToSelector:selector]) {
                Class class = [self propertyClassBy:selector];
                NSString *className = NSStringFromClass(class);
                [modelPropertyArray addObject:@{propertyNameString:className}];
            }
        }
        _modelPropertyArray = modelPropertyArray.copy;
    }
    return _modelPropertyArray;
}
- (NSArray<NSDictionary<NSString *,NSString *> *> *)modelArrayPropertyArray{
    if (!_modelArrayPropertyArray) {
        NSMutableArray *modelArrayPropertyArray = [NSMutableArray array];
        for (NSString *propertyNameString in self.modelPropertyNameArray) {
            NSString *selectorString = [NSString stringWithFormat:@"%@JCFModelArray",propertyNameString];
            SEL selector =  NSSelectorFromString(selectorString);
            if ([_modelClass respondsToSelector:selector]) {
                Class class = [self propertyClassBy:selector];
                NSString *className = NSStringFromClass(class);
                [modelArrayPropertyArray addObject:@{propertyNameString:className}];
            }
        }
        _modelArrayPropertyArray = modelArrayPropertyArray.copy;
    }
    return _modelArrayPropertyArray;
}
- (NSArray *)modelPropertyNameArray{
    if (!_modelPropertyNameArray) {
        NSMutableArray *modelPropertyNameArray = [NSMutableArray array];
        unsigned int count;
        objc_property_t *propertys = class_copyPropertyList(_modelClass, &count);
        for (int i = 0; i<count; i++) {
            objc_property_t pro = propertys[i];
            const char *cName = property_getName(pro);
            NSString *proprttyNameString = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
            [modelPropertyNameArray addObject:proprttyNameString];
        }
        _modelPropertyNameArray = modelPropertyNameArray.copy;
    }
    return _modelPropertyNameArray;
}

@end

//model

#import "ModelBase.h"
#import "CeShiCar.h"
#import "CeShiDog.h"

@interface CeShiPeople : ModelBase
@property (nonatomic, strong)NSString *name;
@property (nonatomic,strong)CeShiCar *car;
@property (nonatomic, strong)NSArray *dogs;

@end
@implementation CeShiPeople
+ (Class)carJCFModel{
    return [CeShiCar class];
}
+ (Class)dogsJCFModelArray{
    return [CeShiDog class];
}
@end

//USING

- (void)fmdb{
    JCF_FMDBRunTimeModelInterface *xx = [[JCF_FMDBRunTimeModelInterface alloc] initWithModelClassName:NSStringFromClass([CeShiPeople class])];
    NSArray *arr0 = xx.modelPropertyNameArray;
    NSArray *arr1 = xx.modelPropertyArray;
    NSArray *arr2 = xx.modelArrayPropertyArray;
    arr0;
}

//RESULT

Printing description of arr0:
<__NSArrayI 0x17005d880>(
name,
car,
dogs
)
Printing description of arr1:
<__NSSingleObjectArrayI 0x170008310>(
{
    car = CeShiCar;
}
)
Printing description of arr2:
<__NSSingleObjectArrayI 0x170008320>(
{
    dogs = CeShiDog;
}
)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 有一种孤独是 明知道结局是曲终人散,可到下却不得不放声大笑,直至在这样的尽兴中流下眼泪。 也许你在某个夜晚悄悄哭...
    没有什么昵称阅读 203评论 0 0
  • 那时花开花见明,若是天有愁泪时,又何见凄凄切切。秋月当空寂春秋,何处话蓑衣。哪得秋童问客来,岂料原是书中人,到头焉...
    夕蝶阅读 284评论 0 1
  • 转眼毕业在即,我们即将作为成年人迈向纷繁复杂的社会,大家或多或少都会成长和改变,然而令人惊掉下巴的是,竟然...
    韩忍冬阅读 335评论 0 0
  • 最近新闻上很火的三个女生:林妙可、杨沛宜、郑爽 三个人最近的新闻标签是: 林妙可:落选,摇头晃脑,长大和小时候一样...
    郑大排阅读 786评论 7 16