最近重读了AFNetworking 3.x的源码,算是温故而知新吧。也梳理了一些优秀的代码细节和面试考点,罗列下来,发现这个库小而精致,简直初学者的宝藏库。
开源库怎么看?
先说个题外话,阅读优质的开源代码库,绝对是程序员们快速提升自我的有效途径,而怎样高效率的去阅读源码同样也是一个问题,不知道有没有人和我之前一样,碰到过读倒是读了,但总感觉收获不大的情况。
这里分享一下我的一些读码经验:
-
多思考,多抛出问题,比如说
- 整体的代码结构是怎样的?类与类之间的关系是怎样的?为什么要这么设计?
- 代码有没有涉及到多线程,其线程模型是怎样的?哪类问题可以适用这种多线程的方案?
- 代码中使用了哪些设计模式?具体是怎么实现的?
-
也可以关注代码细节,遇到不熟悉的用法不要放过,多刨根究底才能夯实基础
关于
AFNetworking
的一些优秀代码细节,我这里也整理了一部分,可以查阅后文 -
一定要记笔记和总结,能分享更好。
参考费曼学习法,我认为这一点是最好的加深理解和强化记忆的手段。随着年龄的增大,记忆力会有所衰退,有个笔记能够回顾,能节约大把再次记忆的时间。此外,多与人分享还能够提升自己的影响力,与人交流验证,也能够为自己查缺补漏。
AFNetworking 3.x的代码结构
还是说回到AFNetworking
这里,AF的代码结构大部分人应该都了解,这里我简单介绍下。AFNetworking 3.x
的代码结构比2.x要简单许多,主要也得益于苹果优化了网络相关的api,整体代码有这么几部分:
-
AFURLSessionManager/AFHTTPSessionManager
这里就是AF代码的核心了,主要负责网络请求的发起,回调处理,是在系统网络相关API上的一层封装。大部分逻辑是在
AFURLSessionManager
里面处理的,AFHTTPSessionManager
则是专为HTTP请求提供了一些便利方法。如果需要扩展其他协议的功能(比如FTP协议),可以考虑从AFURLSessionManager
创建一个子类。 -
AFURLRequestSerialization/AFURLResponseSerialization
这两兄弟主要处理一些参数序列化相关的工作。
AFURLRequestSerialization
是将传入的参数构造成NSURLRequest
,比如自定义的header,一些post或者get参数等等。AFURLResponseSerialization
主要是将系统返回的NSURLResponse
处理成我们需要的responseObject,比如json、xml、image等等 -
AFSecurityPolicy
处理https相关的公钥和验证逻辑。目前由于苹果ATS的开启,基本HTTPS