也许在属性的观察方面每个人有自己不同的方法,例如可以通过检测属性的初值是否发生变化
当然只要达到了我们的目的就可以了
现在来看一下AFN是如何来判断属性是否发生变化的
当AFN中的AFHTTPRequestSerializer类在创建的时候,在构造函数-init中就已经通过KVO添加对属性的观察
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
[self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext];
}
}
如上代码中
AFHTTPRequestSerializerObservedKeyPaths()
是定义好的函数返回值是一个数组,数组中存放的是需要观察的属性的-get 方法,当然是转换成字符串之后存放在数组中
static NSArray * AFHTTPRequestSerializerObservedKeyPaths() {
static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))];
});
return _AFHTTPRequestSerializerObservedKeyPaths;
}
OK,现在也已经添加过观察者观察属性是否发生变化,但是如何知道具体的那个属性发生变化呢
AFHTTPRequestSerializer 有这么一个集合属性
@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths;
这个就是用来存放具体的那个属性发生了变化,也就是当
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(__unused id)object
change:(NSDictionary *)change
context:(void *)context 被调用的时候,检测值是否发生变化,将发生变化的keyPath添加到集合中,当然如果新值为nil的话,需要从集合中删除掉
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(__unused id)object
change:(NSDictionary *)change
context:(void *)context
{
if (context == AFHTTPRequestSerializerObserverContext) {
if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
[self.mutableObservedChangedKeyPaths removeObject:keyPath];
} else {
[self.mutableObservedChangedKeyPaths addObject:keyPath];
}
}
}
通过这样的方法就能够很巧妙的观测属性的变化,这样的观测方法相较于检测初值是否发生变化有什么优点呢?
1.我们不用记着每个属性的初值为多少(当需要判断初值是否变化的情况)
2.当使用的时候不用判断每个属性的的值是否等于初值,这样就能够减少一定量的代码(当需要判断初值是否变化的情况)
3.代码的逻辑更加清楚,只需要查看变化的属性的即可,少了许多的判断
4.会使你的代码看起来更加高大上
当然每个人都有自己的方法,AFN的这个方法是值得我们借鉴的
【注】
1.以上代码来自AFN3.1.0的
2.如若表达有误欢迎指正