前言
進(jìn)階三回顧前兩篇文章,共分兩部分。第一部分寫個奇怪的小程序,用來說明KVO的監(jiān)聽和被監(jiān)聽對象的可變性,第二部分接著上篇寫KVO的依賴設(shè)置
正文
part 1
這部分直接貼代碼,有疑問的地方歡迎提問(內(nèi)部有循環(huán)引用沒有解除)

Bridge

Person

Main
part 2
進(jìn)階二中提到過KVO的內(nèi)部通知,很容易想到是否可以在某個方法中設(shè)置多個屬性通知從而達(dá)到依賴的目的。

Observer.png

Person.h

Person.m

Main
其實如果進(jìn)入Foundation/NSKeyValueObserving.h中可以發(fā)現(xiàn)這么個方法
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key
這里可以直接實現(xiàn)KVO的依賴。把Person.m中的兩個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