@我们应用程序使用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"等系统keyword的时候,也能通过forUndefinedKey方法解决,举例:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key { // 当大众点评接口属性商店id不是"bussine_id"而是"id"时,"id"不兼容键值编码 if([key isEqualToString:@"id"]){ self.bussine_id = value; } }5.第三点中的崩溃问题,我就用实际測试效果来解释: