MJExtension 中模型转字典[model mj_keyValues]键值丢失问题

862 阅读1分钟

[model mj_keyValues] model中变量数据为nil时转换时键值对丢失

问题出在mj_keyValues转换时,判断value没有值时直接返回,未进行键值对的转化

- (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys

{

    // 如果自己不是模型类, 那就返回自己

    // 模型类过滤掉 NSNull

    // 唯一一个不返回自己的

    if ([self isMemberOfClass:NSNull.class]) { return nil; }

    // 这里虽然返回了自己, 但是其实是有报错信息的.

    // **TODO: 报错机制不好, 需要重做**

    MJExtensionAssertError(![MJFoundation isClassFromFoundation:[self class]], (NSMutableDictionary *)self, [self class], @"不是自定义的模型类")

    

    id keyValues = [NSMutableDictionary dictionary];

    

    Class clazz = [self class];

    NSArray *allowedPropertyNames = [clazz mj_totalAllowedPropertyNames];

    NSArray *ignoredPropertyNames = [clazz mj_totalIgnoredPropertyNames];

    

    [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {

        @try {

            // 0.检测是否被忽略

            if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;

            if ([ignoredPropertyNames containsObject:property.name]) return;

            if (keys.count && ![keys containsObject:property.name]) return;

            if ([ignoredKeys containsObject:property.name]) return;

            

            // 1.取出属性值

            id value = [property valueForObject:self];

            if (!value) return;

处理方式1:源码修改(非pod)

处理方式2:在对应model .m中实现如下协议方法,转换时完成返回数据前会进行此方法调用,进行遍历处理,补上缺失的数据

///mj_keyValues转换完返回dic之前调用(处理空数据)

- (void)mj_objectDidConvertToKeyValues:(NSDictionary *)keyValues{

    Class clazz = [self class];

    [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {

        

        id value = [property valueForObject:self];

        Class propertyClass = property.type.typeClass;

        if (value == nil) {

            

            if (propertyClass == [NSString class]) {

                

                [keyValues setValue:@"" forKey:property.name];

            }else if(propertyClass == [NSNumber class]){

                

                [keyValues setValue:@(0) forKey:property.name];

            }
            //自行进行其他类型的匹配处理

        }

    }];

}