AFN2.X/3.X网络请求原理

2017-09-03  本文已影响28人  b470b9fc7145

AFURLConnectionOperation原理:
1:首先我们可以看到他创建了一个单例线程,用来处理AFN发起的所有请求任务,runloop一直运行,用来处理请求完成后回调(代理)。当然,现成也跟随着一个runLoop,AFN将这个runloop的模式设置成了NSDefaultRunLoopMode。但NSDefaultRunLoopMode是无法检测到connection的状 态的。这说明了,AFN将不会在这该线程处理connection完成后的UI刷新等工作,而是会将数据抛给主线程,让主线程去完成UI的刷新。
2:我们可以看到该类通过接受请求的字符串,创建了URLRequest以及NSURLConnection对象。从而去进行请求。
3:实现文件多次使用到了锁,可以保证数据的安全。当然他也实现了几个数据的NSCoping协议。
4:请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态的控制。这里讲一下暂停和恢复。暂停实际上将网络请求取消掉了。但是由于实现了nscoping协议,已经下载到数据得以保存下来。下次进行相同请求的时候,我们会将已经下载到的数据的节 点一起发送给服务器,告诉服务器这些部门的数据我们不需要了,服务器根据我发送的返回节点给我返回相应的数据即可。从而实现了暂停和恢复功能,也就是断点 续传。
5:operation方法的重写。自行google,这里不赘述。
6:状态的各种控制方法的实现以及发送状态改变的通知

Thread.png

注意

  1. AFHTTPRequestOperation is a subclass of AFURLConnectionOperation
  2. AFURLConnectionOperation
  3. AFURLConnectionOperation重写父类的start方法,在里面开启一个线程.
  4. AFN 的做法是把网络请求的解析都放在同一个子线程中进行(子线程调用异步接口,子线程需要有Runloop去接收异步回调事件,这里也可以每个请求都新建一条带有Runloop的线程去侦听回调,但这一点好处都没有,既然是异步回调,除了处理回调内容,其他时间线程都是空闲可利用的,所有请求共用一个响应的线程就够了。)
  5. 由于NSUrlSession参考了AF的2.x的优点,自己维护了一个线程池,做Request线程的调度与管理,所以在AF3.x中,没有了常驻线程,都是用的时候run,结束的时候stop。

http://www.jianshu.com/p/d0e98985c784
http://www.jianshu.com/p/6b3d0f3a7bac
深入研究 Runloop 与线程保活
AFNetworking2.0源码解析<一>
iOS RunLoop 探究

tips

接收回调的单利线程是通过重写start方法加进去的.

//NSOperation方法
- (void)start;
- (void)cancel;
//

上一篇下一篇

猜你喜欢

热点阅读