[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];
}
//自行进行其他类型的匹配处理
}
}];
}