AFNetworking_Deep

文章写于 2018-6-24, 阅读的是 AFNetworking 3.2.1

之前看了很多别人写的文章, 是按着别人的思路学习的, 感觉以我现在水平, 可以有自己的理解了. 网上搜到的文章大部分都是主流程, 我已经比较熟悉主流程了, 这里会写一些细节

AFHTTPSessionManager.m

204

if (serializationError) {
        if (failure) {
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
        }

        return nil;
    }

无法生成request时, AF会把失败的block放到一个并发队列(如果有的话)/主队列中. YTKNetwork初始化了这个并发队列

AFURLRequestSerialization.m

370

// 只初始化一次的静态数组, 可以这么写
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;
}

观察某个属性名的时候, 不要写成@"allowsCellularAccess"这种形式, 要充分利用编译器, 这样写

NSStringFromSelector(@selector(allowsCellularAccess))

371

self.mutableObservedChangedKeyPaths 

AF把AFHTTPRequestSerializerObservedKeyPaths里面变化的属性都放到mutableObservedChangedKeyPaths 这里了

246

[self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext];

// context的正确初始化方式
static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext;

530

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    if ([AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) {
        return NO;
    }

    return [super automaticallyNotifiesObserversForKey:key];
}

AFHTTPRequestSerializerObservedKeyPaths 这个数组里的属性 设置为手动触发KVO(学要手动调用willChange和didChange方法触发)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • AFNetworking2.0源码解析<一> AFNetworking2.0源码解析<二>-- 构建普通请求: 格...
    钱嘘嘘阅读 5,741评论 0 4
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,041评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,866评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • 文/黄丽明/漫萍 那是四,五年前的事了。大妞七岁,二妞五岁,儿子才三岁。 从市集上买回一西瓜,宝贝们立马就想开吃,...
    黄丽明漫萍阅读 1,644评论 5 4