Skip to content

Commit

Permalink
优化json/xml转模型对象性能
Browse files Browse the repository at this point in the history
  • Loading branch information
netyouli committed Mar 9, 2016
1 parent 73e1caf commit 91b0c8b
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 18 deletions.
38 changes: 27 additions & 11 deletions WHC_DataModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,36 @@

@interface WHC_DataModel : NSObject

/*参数说明
array:json数组对象
className:对象模型类
功能说明:把json数组对象解析为className对象模型数组
返回className对象模型数组
*/
/** 说明
* array:json数组对象
* className:对象模型类
* 功能说明:把json数组对象解析为className对象模型数组
* 返回className对象模型数组
*/
+ (NSArray*)dataModelWithArray:(NSArray*)array className:(Class)className;

/*参数说明
dictionary:json字典对象
className:对象模型类
功能说明:把json字典对象解析为className对象
返回className对象
/** 说明
* dictionary:json字典对象
* className:对象模型类
* 功能说明:把json字典对象解析为className对象
* 返回className对象
*/
+ (id)dataModelWithDictionary:(NSDictionary*)dictionary className:(Class)className;

/** 说明
* data 数组数据对象
* className:对象模型类
* 功能说明:把json数组对象解析为className对象模型数组
* 返回className对象模型数组
*/
+ (NSArray *)dataModelWithArrayData:(NSData *)data className:(Class)className;

/** 说明
* data :字典数据对象
* className:对象模型类
* 功能说明:把json字典对象解析为className对象
* 返回className对象
*/
+ (id)dataModelWithDictionaryData:(NSData *)data className:(Class)className;

@end
61 changes: 54 additions & 7 deletions WHC_DataModel.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

/*
* qq:712641411
* iOS大神qq群:460122071
* gitHub:https://github.com/netyouli
* csdn:http://blog.csdn.net/windwhc/article/category/3117381
*/
Expand All @@ -31,6 +30,11 @@ - (instancetype)init{
return self;
}

+ (NSArray *)dataModelWithArrayData:(NSData *)data className:(Class)className{
NSArray * array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
return [WHC_DataModel dataModelWithArray:array className:className];
}

+ (NSArray*)dataModelWithArray:(NSArray*)array className:(Class)className{
NSMutableArray * _array = [NSMutableArray new];
for (NSDictionary * dict in array) {
Expand All @@ -45,6 +49,11 @@ + (id)dataModelWithDictionary:(NSDictionary*)dictionary className:(Class)classNa
return object;
}

+ (id)dataModelWithDictionaryData:(NSData *)data className:(Class)className{
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
return [WHC_DataModel dataModelWithDictionary:dict className:className];
}

- (NSString *)getClassNameString:(const char *)attr{
NSString * strClassName = nil;
NSString * attrStr = @(attr);
Expand All @@ -64,11 +73,21 @@ - (BOOL)existproperty:(NSString *)property withObject:(NSObject *)object{
Ivar *vars = class_copyIvarList([object class], &propertyCount);
for (NSInteger i = 0; i < propertyCount; i++) {
Ivar var = vars[i];
NSString * tempProperty = [[NSString stringWithUTF8String:ivar_getName(var)] stringByReplacingOccurrencesOfString:@"_" withString:@""];
if([property isEqualToString:tempProperty]){
NSRange prefixRange = {0,1};
NSString * originalProperty = [NSString stringWithUTF8String:ivar_getName(var)];
if([[originalProperty substringWithRange:prefixRange] isEqualToString:@"_"]) {
originalProperty = [originalProperty substringFromIndex:1];
}
if([property isEqualToString:originalProperty]){
if (vars) {
free(vars);
}
return YES;
}
}
if (vars) {
free(vars);
}
return NO;
}

Expand All @@ -78,8 +97,12 @@ - (Class)classExistProperty:(NSString *)property withObject:(NSObject *)object{
Ivar *vars = class_copyIvarList([object class], &propertyCount);
for (NSInteger i = 0; i < propertyCount; i++) {
Ivar var = vars[i];
NSString * tempProperty = [[NSString stringWithUTF8String:ivar_getName(var)] stringByReplacingOccurrencesOfString:@"_" withString:@""];
if([property isEqualToString:tempProperty]){
NSRange prefixRange = {0,1};
NSString * originalProperty = [NSString stringWithUTF8String:ivar_getName(var)];
if([[originalProperty substringWithRange:prefixRange] isEqualToString:@"_"]) {
originalProperty = [originalProperty substringFromIndex:1];
}
if([property isEqualToString:originalProperty]){
NSString * type = [NSString stringWithUTF8String:ivar_getTypeEncoding(var)];
if([type hasPrefix:@"@"]){
type = [type stringByReplacingOccurrencesOfString:@"@" withString:@""];
Expand All @@ -88,9 +111,31 @@ - (Class)classExistProperty:(NSString *)property withObject:(NSObject *)object{
}
}
}
if (vars) {
free(vars);
}
return class;
}

- (NSString *)getClassProperty:(Class)class key:(NSString *)key {
if (key != nil && key.length > 0) {
unsigned int propertyCount = 0;
objc_property_t *properties = class_copyPropertyList(class, &propertyCount);
for (unsigned int i = 0; i < propertyCount; ++i) {
objc_property_t property = properties[i];
const char * name = property_getName(property);
NSString * nameStr = [NSString stringWithUTF8String:name];
if ([nameStr isEqualToString:key]) {
const char * attributes = property_getAttributes(property);
NSString * attr = [NSString stringWithUTF8String:attributes];
NSArray * arrayString = [attr componentsSeparatedByString:@"\""];
return arrayString[1];
}
}
}
return key;
}

- (id)handleDataModelEngine:(id)object arrKey:(NSString*)arrKey calssName:(Class)className{
if(object){
id modelObject = [className new];
Expand Down Expand Up @@ -129,7 +174,8 @@ - (id)handleDataModelEngine:(id)object arrKey:(NSString*)arrKey calssName:(Class
}
}else{
if(subObject && ![subObject isKindOfClass:[NSNull class]]){
id subModelObject = [self handleDataModelEngine:subObject arrKey:keyArr[i] calssName:objc_getClass([keyArr[i] UTF8String])];
Class class = objc_getClass([[self getClassProperty:[modelObject class] key:keyArr[i]] UTF8String]);
id subModelObject = [self handleDataModelEngine:subObject arrKey:keyArr[i] calssName:class];
if([self existproperty:keyArr[i] withObject:modelObject]){
[modelObject setValue:subModelObject forKey:keyArr[i]];
}
Expand Down Expand Up @@ -202,9 +248,10 @@ - (id)handleDataModelEngine:(id)object arrKey:(NSString*)arrKey calssName:(Class
}
}
}else if (propertyClass == objc_getClass([propertyName UTF8String])){
Class class = objc_getClass([propertyName UTF8String]);
id subObject = [object objectForKey:propertyName];
if(subObject && ![subObject isKindOfClass:[NSNull class]]){
id subModelObject = [self handleDataModelEngine:subObject arrKey:propertyName calssName:objc_getClass([propertyName UTF8String])];
id subModelObject = [self handleDataModelEngine:subObject arrKey:propertyName calssName:class];
[modelObject setValue:subModelObject forKey:propertyName];
}else{
[modelObject setValue:[objc_getClass([propertyName UTF8String]) new] forKey:propertyName];
Expand Down

0 comments on commit 91b0c8b

Please sign in to comment.