AFNetworking之观察属性的变化


也许在属性的观察方面每个人有自己不同的方法,例如可以通过检测属性的初值是否发生变化

当然只要达到了我们的目的就可以了

现在来看一下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.如若表达有误欢迎指正



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值