@我們應用程序使用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.第三點中的崩潰問題,我就用實際測試效果來解釋: