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.第三点中的崩溃问题,我就用实际测试效果来解释:
@先来看一段代码:
[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.第三点中的崩溃问题,我就用实际测试效果来解释:
相关文章推荐
- Drop Sessions(Part 1 of 2)
- HDU5569 matrix(dp)
- Tomcat server.xml配置示例
- sql 查询慢的48个原因分析(分享)
- POJ 2085 Inversion
- Bmob云的使用_快速入门
- C语言二叉树的层序遍历
- leveldb源码--PosixEnv代码分享
- 你需要明白的SQL SERVER书签查找(Bookmark Lookup)
- 多校连萌 简单的求和
- 最简单的抓包程序
- Oracle 序列(二)
- Oracle 表及表空间(一)
- 知原理(2)
- Java中的String为什么是不可变的?
- android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)
- 信息安全系统设计基础实验二
- MyBatis 初始配置
- ThinkPHP学习-2
- 浅谈JavaScript中的伪类 (李睿豪)