KVC在定義Model類中的妙用

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





發佈了169 篇原創文章 · 獲贊 13 · 訪問量 87萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章