iOS使用KVO設(shè)置鍵值觀察依賴鍵

iOS使用KVO設(shè)置鍵值觀察依賴鍵

應(yīng)用場(chǎng)景:一個(gè)對(duì)象的屬性之間是相互關(guān)聯(lián)的,也就是對(duì)象的一個(gè)屬性依賴于另一個(gè)對(duì)象的一個(gè)獲多個(gè)屬性梢薪。如果這些被依賴屬性中的任意一個(gè)值發(fā)生改變,那么原屬性的值也會(huì)發(fā)生相應(yīng)的改變尝哆。

實(shí)戰(zhàn):首先定義類(lèi)Student秉撇,Person。Person作為Student的屬性定義。
Student中的infomation依賴于Person中的name和age琐馆。

@interface Person : NSObject

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

@end

@interface Student : NSObject

@property(nonatomic, copy) NSString *infomation;
@property(nonatomic, strong) Person *person;

@end

要實(shí)現(xiàn)上述依賴關(guān)系规阀,對(duì)象類(lèi)需要實(shí)現(xiàn)以下兩點(diǎn):

  1. 需要手動(dòng)實(shí)現(xiàn)infomation的setter和getter。
  2. 實(shí)現(xiàn)keyPathsForValuesAffectingValueForKey: 或 keyPathsForValuesAffectingInfomation方法瘦麸。這兩個(gè)方法的作用是告訴系統(tǒng)infomation屬性依賴于person中的age和name屬性谁撼。
@implementation Student

- (instancetype)init {
    if (self = [super init]) {
        self.infomation = @"";
        self.person = [[Person alloc]init];
        self.person.name = @"";
        self.person.age = 0;
    }
    return self;
}

- (NSString *)infomation {
    return [NSString stringWithFormat:@"student_name = %@ | student_age = %ld",self.person.name,self.person.age];
}

- (void)setInfomation:(NSString *)infomation {
    NSArray *array = [infomation componentsSeparatedByString:@"#"];
    if (array && array.count == 2) {
        self.person.name = array[0];
        self.person.age = ((NSNumber *)array[1]).integerValue;
    }
}

+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    if ([key isEqualToString:@"infomation"]) {
        NSSet *set = [NSSet setWithObjects:@"person.name", @"person.age",nil];
        return set;
    }
    return nil;
}

//+ (NSSet<NSString *> *)keyPathsForValuesAffectingInfomation {
//    NSSet *set = [NSSet setWithObjects:@"person.name", @"person.age",nil];
//    return set;
//}

@end

KVO實(shí)現(xiàn):
1.初始化student,并且為student添加觀察者滋饲,觀察information屬性(注意此處是觀察information)厉碟,以及實(shí)現(xiàn)observeValueForKeyPath:ofObject:change:context回調(diào)方法。
2.點(diǎn)擊觸發(fā)修改person中的name和age了赌。

- (void)viewDidLoad {
    [super viewDidLoad];

    self.student = [[Student alloc]init];
    [self.student setInfomation:@"Charlie#30"];
    
    [self.student addObserver:self forKeyPath:@"infomation" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"infomation"]) {
        NSLog(@"OBSERVE : old infomation = %@ | new infomation = %@", change[NSKeyValueChangeOldKey], change[NSKeyValueChangeNewKey]);
    }
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.student.person.name = @"Vivian";
    self.student.person.age = 40;
}

輸出:

2019-01-11 10:32:42.533291+0800 CLTestKVO[37577:1834387] OBSERVE : old infomation = student_name = Charlie | student_age = 30 | new infomation = student_name = Vivian | student_age = 30

2019-01-11 10:32:42.533465+0800 CLTestKVO[37577:1834387] OBSERVE : old infomation = student_name = Vivian | student_age = 30 | new infomation = student_name = Vivian | student_age = 40

通過(guò)輸出結(jié)果可以看出墨榄,當(dāng)修改了name和age的時(shí)候玄糟,infomation屬性會(huì)收到觀察者的通知勿她。注意,此處收到了兩次通知阵翎,分別是修改name和修改age對(duì)應(yīng)的觀察者通知逢并。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郭卫,隨后出現(xiàn)的幾起案子砍聊,更是在濱河造成了極大的恐慌,老刑警劉巖贰军,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玻蝌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡词疼,警方通過(guò)查閱死者的電腦和手機(jī)俯树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贰盗,“玉大人许饿,你說(shuō)我怎么就攤上這事《嬗” “怎么了陋率?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秽晚。 經(jīng)常有香客問(wèn)我瓦糟,道長(zhǎng),這世上最難降的妖魔是什么赴蝇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任菩浙,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芍耘。我一直安慰自己址遇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布斋竞。 她就那樣靜靜地躺著倔约,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坝初。 梳的紋絲不亂的頭發(fā)上浸剩,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音鳄袍,去河邊找鬼绢要。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拗小,可吹牛的內(nèi)容都是我干的重罪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哀九,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剿配!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阅束,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呼胚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后息裸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝇更,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年呼盆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了年扩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宿亡,死狀恐怖常遂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挽荠,我是刑警寧澤克胳,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站圈匆,受9級(jí)特大地震影響漠另,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跃赚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一笆搓、第九天 我趴在偏房一處隱蔽的房頂上張望性湿。 院中可真熱鬧,春花似錦满败、人聲如沸肤频。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宵荒。三九已至,卻和暖如春净嘀,著一層夾襖步出監(jiān)牢的瞬間报咳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工挖藏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暑刃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓膜眠,卻偏偏與公主長(zhǎng)得像岩臣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柴底,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容