一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ios-kvc\kvo 用法

 沒(méi)原創(chuàng)_去搜索 2015-07-31

KVC(Key-value coding)鍵值編碼,類似于map,提供了一種使用字符串而不是訪問(wèn)器方法去訪問(wèn)一個(gè)對(duì)象實(shí)例變量的機(jī)制。         

KVO(Key-value observing)鍵值觀察,提供了一種當(dāng)其它對(duì)象屬性被修改的時(shí)候能通知當(dāng)前對(duì)象的機(jī)制。


用法:
Model類 

User.h

@interface User : NSObject

@property (nonatomic,copy) NSString *userId;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,copy) NSString *sex;

- (id)initWithDictionary:(NSDictionary *)jsonDictionary;
@end

User.m

@implementation User

- (id)initWithDictionary:(NSDictionary *)jsonDictionary
{
    self = [super init];
    if(self){
        [self setValuesForKeysWithDictionary:jsonDictionary];
    }
    return self;
}

setValuesForKeysWithDictionary這個(gè)方法就是koc中的,用于匹配類中與字典key同名的屬性,并賦值給屬性,如果self是派生類,則會(huì)自動(dòng)匹配派生類進(jìn)行賦值。用這個(gè)來(lái)做json的映射看上面是很簡(jiǎn)單。

我們看看jsonDictionary的內(nèi)容:

"id" : "0",
"name" : "jack",
"age" : 15,
"sex" : "male"

那執(zhí)行完setValuesForKeysWithDictionary這個(gè)方法后User的屬性就都會(huì)有值了。

注意你的程序執(zhí)行到setValuesForKeysWithDictionary會(huì)崩潰。

仔細(xì)一點(diǎn)我們會(huì)發(fā)現(xiàn) json 里面的id和屬性里面的id不對(duì)應(yīng)。(對(duì)于id這個(gè)鍵來(lái)說(shuō),這個(gè)類不兼容鍵值編碼)

KVO提供了一個(gè)解決方法setValue:forUndefinedKey:用于處理上面的情況

我們需要實(shí)現(xiàn)setValue:forUndefinedKey:這個(gè)函數(shù)
- (void)setValue:(id)value forUndefinedKey:(NSString *)key  {
    if([key isEqualToString:@"id"])
       self.userId = value;
}

這樣就沒(méi)事了,然后順便說(shuō)說(shuō),其實(shí)可以做一個(gè)model的基類,然后基類里面去做這些處理,如果有特殊的key可以在子類實(shí)現(xiàn):
子類:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key  {
    if([key isEqualToString:@"id"])
       self.userId = value;
    else
       [super setValue:value forKey:key];
}

然后基類里面也實(shí)現(xiàn)這個(gè)函數(shù)

- (void)setValue:(id)value forUndefinedKey:(NSString *)key  {
  NSLog(@"Undefined Key: %@", key);
}
這樣就不會(huì)崩潰了。

上面只是舉個(gè)例子,一般開(kāi)發(fā)建議Model基類里面去做上面的全部處理,然后子類做和自己相關(guān)的處理。

最后看一下調(diào)用


NSDictionary *responseDictionary = [completedOperation responseJSON];
User *user = [[User alloc] initWithDictionary:responseDictionary];
這就是KVO的能力,比之前自己去解析json做數(shù)據(jù)對(duì)應(yīng)簡(jiǎn)單多了,同時(shí)如果服務(wù)器發(fā)送過(guò)來(lái)的json鍵名發(fā)生了變動(dòng),NSLog語(yǔ)句就會(huì)把未定義的鍵輸出到控制臺(tái),而不會(huì)崩潰。


在派生類中添加用于處理深復(fù)制的方法也是非常好的。只需要覆蓋NSCopying和NSMutableCopying中的方法就可以了

KVC還有很多有用的地方,簡(jiǎn)單了解一下:

key就是確定對(duì)象某個(gè)值的字符串,它通常和accessor方法或是變量同名,并且必須以小寫字母開(kāi)頭。Key path就是以“.”分隔的key,因?yàn)閷傩灾狄材馨瑢傩?。比如我們可以person這樣的key,也可以有key.gender這樣的key path。

獲取屬性值時(shí)可以通過(guò)valueForKey:的方法,設(shè)置屬性值用setValue:forKey:。與此同時(shí),KVC還對(duì)未定義的屬性值定義了 valueForUndefinedKey:,你可以重載以獲取你要的實(shí)現(xiàn)(補(bǔ)充下,KVC定義在NSKeyValueCoding的非正式協(xié)議里)。

在O-C 2.0引入了property,我們也可以通過(guò).運(yùn)算符來(lái)訪問(wèn)屬性。下面直接看個(gè)例子:

@property NSInteger number;

instance.number =3;
[instance setValue:[NSNumber numberWithInteger:3] forKey:@"number"];

注意KVC中的value都必須是對(duì)象。

以上介紹了通過(guò)KVC來(lái)獲?。O(shè)置屬性,接下來(lái)要說(shuō)明下實(shí)現(xiàn)KVC的訪問(wèn)器方法(accessor method)。Apple給出的慣例通常是:

-key:,以及setKey:(使用的name convention和setter/getter命名一致)。對(duì)于未定義的屬性可以用setNilValueForKey:。


      


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    久久精视频免费视频观看| 国内精品一区二区欧美| 国产一级内片内射免费看 | 国产精品成人免费精品自在线观看| 亚洲第一区二区三区女厕偷拍| 国产超碰在线观看免费| 老鸭窝精彩从这里蔓延| 日韩精品一区二区亚洲| 日韩在线中文字幕不卡| 国产精品一区二区香蕉视频| 日韩成人h视频在线观看| 欧美日韩国产一级91| 91人妻丝袜一区二区三区| 久久99午夜福利视频| 欧美日韩国产精品自在自线| 亚洲中文字幕乱码亚洲| 日本不卡在线视频你懂的| 热情的邻居在线中文字幕| 日韩夫妻午夜性生活视频| 一区二区福利在线视频| 精品少妇人妻av一区二区蜜桃| 日本午夜一本久久久综合| 99国产一区在线播放| 中文字幕人妻综合一区二区| 少妇高潮呻吟浪语91| 国产伦精品一区二区三区精品视频| 日本成人三级在线播放| 国产三级黄片在线免费看| 国产户外勾引精品露出一区| 亚洲国产欧美精品久久| 婷婷激情五月天丁香社区| 精品午夜福利无人区乱码| 国产一级二级三级观看| 欧美一区二区在线日韩| 日本高清不卡在线一区| 欧美一区二区三区99| 日韩人妻av中文字幕| 国产一级内片内射免费看| 91福利免费一区二区三区| 久久人人爽人人爽大片av| 亚洲精品日韩欧美精品|