自己动手写个MJExtension或者Mantle

2015-06-01  本文已影响1078人  laurence2100

iOS里面的模型映射的核心就是KVC。Let's start。

1。起源:你的App肯定有许多模型对象,但是如果都在这些模型对象里面,分别编写KVC,那就麻烦了,所以,我们在这里应该写个基类,来处理KVC,其他不同需求的事情交给子类。步骤1===》建立基于NSObject的类。我们叫做JSONModel

2。在JSONModel里面对外暴露一个方法:-(id)initWithDictionary:(NSDictionary *)dic;在这个方法里面,关键调用了一个方法,他就是 [self setValuesForKeysWithDictionary:dic],这个方法就是KVC,用来匹配类中与字典key同名的属性。到这里KVC,核心字典转模型对象就完成了。setValuesForKeysWithDictionary实际背后做了这几个事情。他会调用这个方法:setKey1,setKey2,setKey3---,所以子类里面只需要实现setKey1,setKey2---之类的方法。最简单的做法就是,用@property                            步骤2===》在JSONModel.类里面实现-(id)initWithDictionary:(NSDictionary *)dic;方法里面的关键就是[self setValuesForKeysWithDictionary:dic]这句核心代码                       步骤3===》建立基与JSONModel的模型对象类,头文件就写@,这些变量的名字要和传入字典的key,他们名字要一致。

3.特殊处理。历史原因就是fuck的后台在返回的字典中,给我们一些这样的字典              {@“id”: 1234, @"description":“这是第一个用户”,@“imageUlr”:@“---”,----},那里面就有id,description,这2个key在转模型对象的时候,在模型对象文件中,以“id”,@"descrption"做@property 名字就会有警告或者编译出差的问题。所以就有了特殊处理。在服务器给你返回的字典中,与之对应的对象模型类中,如果key里面有特殊关键字,首先,在@property里面名字改一下,比如userId, userDescription, 然后,你就再对象模型中多写一个方法:- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ if([key isEqualToString:@"id"] )  self.userid = value;  if([key isEqualToString@"description"]  self.userDescription = value)  else  [super  setValue:value forKey:key] };

4.我听说Mantle这个库的关键部分就是上面的,不知道是不是真的。反正上面帮助你理解那些开源库是有帮助的,后面怎么优化,那就参考开源库的源码了!!!

上一篇下一篇

猜你喜欢

热点阅读