前言
進(jìn)階三回顧前兩篇文章豆混,共分兩部分晾剖。第一部分寫個(gè)奇怪的小程序励负,用來說明KVO的監(jiān)聽和被監(jiān)聽對(duì)象的可變性,第二部分接著上篇寫KVO的依賴設(shè)置
正文
part 1
這部分直接貼代碼棚壁,有疑問的地方歡迎提問(內(nèi)部有循環(huán)引用沒有解除)
Bridge
Person
Main
part 2
進(jìn)階二中提到過KVO的內(nèi)部通知杯矩,很容易想到是否可以在某個(gè)方法中設(shè)置多個(gè)屬性通知從而達(dá)到依賴的目的。
Observer.png
Person.h
Person.m
Main
其實(shí)如果進(jìn)入Foundation/NSKeyValueObserving.h
中可以發(fā)現(xiàn)這么個(gè)方法
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key
這里可以直接實(shí)現(xiàn)KVO的依賴袖外。把Person.m
中的兩個(gè)setter干掉史隆,然后代碼這樣寫
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"fullName"]) {
NSArray *affectingKeys = @[@"givenName", @"familyName"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
return keyPaths;
}
再來看一次運(yùn)行結(jié)果
Main