首页 > 代码库 > KVC在定义Model类中的妙用
KVC在定义Model类中的妙用
@我们应用程序使用MVC架构的话,对于处理数据类,我们会单独的定义Model类,在里面为要展示的属性进行初始化赋值,一般采用的方法是通过定义对应的属性,挨个赋值.现在我要介绍的就是通过KVC,key-value的方式,进行赋值.
@先来看一段代码:
#import <Foundation/Foundation.h> @interface MDCAllShopObjectModel : NSObject // 定义全部商铺信息类要显示的内容的属性 @property (nonatomic, copy) NSString *name; // 商店名 @property (nonatomic, copy) NSString *businessId; // 属性商铺id @property (nonatomic, copy) NSString *address; // 商铺地址 @property (nonatomic, copy) NSString *telephone; // 商铺电话 @property (nonatomic, copy) NSString *business_id; // KVC商铺id /** * 自定义一个商点信息类的初始化方法 * * @param dic 解析出来的团购商店的数据是字典 * * @return 商店对象 */ -(id)initWithDictionary:(NSDictionary *)dic; /** * KVC赋值方式 * * @param KVCDic 解析出来的团购商店的数据是字典 * * @return 商店对象 */ - (id)initWithKVCDictionary:(NSDictionary *)KVCDic; @end
#import "MDCAllShopObjectModel.h" @implementation MDCAllShopObjectModel - (id)initWithDictionary:(NSDictionary *)dic{ if (self = [super init]) { self.name = dic[@"name"]; self.businessId = [dic[@"business_id"] stringValue]; self.address = dic[@"address"]; self.telephone = dic[@"telehpone"]; } return self; } - (id)initWithKVCDictionary:(NSDictionary *)KVCDic{ if (self = [super init]) { [self setValuesForKeysWithDictionary:KVCDic]; } return self; } - (void)setValue:(id)value forUndefinedKey:(NSString *)key{ NSLog(@"key = %@",key); }@先看.h文件,我定义了2个商店ID属性来展示区别.先声明:大众点评接口中返回的数据id是"business_id".
1.当用属性方式赋值的时候,所取的属性名可以不与请求数据中的属性名相同;而用KVC方式赋值的时候,则必须完全相同,切记,大小写都不能错.
2.用属性方式赋值,所定义的属性数量很自由,你需要用到什么就定义什么,不受请求数据接口返回数据的属性数量限制;而用KVC方式赋值,setValuesForKeysWithDictionary方法会遍历请求到的字典中的所有属性,所有的key都会一一对应的赋值,这个时候,也就要求你在Model中定义所有的属性来接收.
3.KVC方式赋值比较方便,毕竟就一句话嘛,但是为了解决2中的问题,就需要用到- (void)setValue:(id)value forUndefinedKey:(NSString *)key这个方法了,当你实现了这个方法,你就也能在用KVC方式赋值的时候,只定义自己需要的属性了,因为当setValuesForKeysWithDictionary找不到对应的key时,程序则会调用forUndefinedKey这个方法,将key对应的值存入到value中,这样,程序就不会崩溃了.
4.当你请求的数据中有"id",""description"等系统关键字的时候,也能通过forUndefinedKey方法解决,举例:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key { // 当大众点评接口属性商店id不是"bussine_id"而是"id"时,"id"不兼容键值编码 if([key isEqualToString:@"id"]){ self.bussine_id = value; } }5.第三点中的崩溃问题,我就用实际测试效果来解释: