KVC在定义Model类中的妙用
来源:互联网 发布:centos安装ant 编辑:程序博客网 时间:2024/04/30 22:45
@我们应用程序使用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.第三点中的崩溃问题,我就用实际测试效果来解释:
- KVC在定义Model类中的妙用
- KVC在定义Model类中的妙用
- KVC在定义Model类中的妙用
- KVC在定义Model类中的使用
- kvc 定义 model
- Django外键查询及@property在model中的妙用
- KVC妙用
- 5、关于kvc中的setValuesForKeysWithDictionary为model赋值
- DoEvents 在VB中的妙用
- 双引号在搜索中的妙用
- 二进制在数学中的妙用
- GetModuleFileName在HOOK中的妙用
- 二进制在数学中的妙用
- 二进制在数学中的妙用
- 二进制在数学中的妙用
- 二进制在数学中的妙用
- #和##在宏中的妙用
- Null在Sass中的妙用
- ThreadLocal
- hdu2089
- 创建进程后得到该进程的主窗口句柄
- 录像过程中系统时间改变了,怎么避免带来的悲剧
- 哈哈
- KVC在定义Model类中的妙用
- JW Player 5.7 去水印版
- iOS Push Notification
- ADF学习:Tree组件的使用
- 匿名内部类、成员类与局部类
- 反向代理原理
- 原文:http://blog.teotigraphix.com/2011/05/17/unity3d-uml-gameobject-cheat-sheet/
- 黑马程序员-银行业务调度系统
- HDU 1281 棋盘游戏 行列匹配