您的位置:首页 > 其它

KVC在定义Model类中的妙用

2015-11-22 15:43 369 查看
@我们应用程序使用MVC架构的话,对于处理数据类,我们会单独的定义Model类,在里面为要展示的属性进行初始化赋值,一般采用的方法是通过定义对应的属性,挨个赋值.现在我要介绍的就是通过KVC,key-value的方式,进行赋值.
@先来看一段代码:

[objc] view plaincopy

#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

[objc] view plaincopy

#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方法解决,举例:

[objc] view plaincopy

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {

// 当大众点评接口属性商店id不是"bussine_id"而是"id"时,"id"不兼容键值编码

if([key isEqualToString:@"id"]){

self.bussine_id = value;

}

}

5.第三点中的崩溃问题,我就用实际测试效果来解释:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: