文章标题

来源:互联网 发布:iphone看片软件 编辑:程序博客网 时间:2024/05/20 06:23

AFNetworking实现原理剖析

AFNetworking是封装的NSURLSession的网络请求

AFNetworking由五个模块组成:

分别由NSURLSession,Security,Reachability,Serialization,UIKit五部分组成

NSURLSession:网络通信模块(核心模块) 对应 AFNetworking中的 AFURLSessionManager和对HTTP协议进行特化处理的AFHTTPSessionManager,AFHTTPSessionManager是继承于AFURLSessionmanager的
Security:网络通讯安全策略模块 对应 AFSecurityPolicy
Reachability:网络状态监听模块 对应AFNetworkReachabilityManager
Seriaalization:网络通信信息序列化、反序列化模块 对应 AFURLResponseSerialization
UIKit:对于IOSUIKit的扩展库

解释一下,对于一个URLConnection需要一个URLRequest作为参数,然后才能load

其实同步和异步方法底层实现的本质是一样,都是告诉系统请求一个URL资源,系统会有自己私有线程去load,然后load完成后告诉调用者。而同步方法是,阻塞调用线程,然后一直等待,直到load完成,一般不会在主线程调用同步方法,这样会阻塞用户交互。异步方法是调用之后就不管了,系统加载完成后会通知调用者,通知调用者的方式有两种,一,代理方式, 系统会在connection的调用线程通知代理。二是queue方式,系统会在调用者指定的queue中通知调用者。

AFnetworing利用的是异步加载数据的方式,而且是代理的方式。首先我们来做加法讲解。

1,首先一个请求的调用必须有一个线程来执行,那么让哪个线程来做,主线程,还是其他线程,一般情况下没人用主线程,因为app中同时请求很多东西,都放在主线程里面去做那么付出的代价时主线程会各种卡顿,代理的各种交互都得让主线程去处理。那么就得用子线程。

用子线程做,创建一个NSthread,执行一个NSURLConnection,然后你得指定一个代理,代理是一个object实例,而且这个object必须拥护存储加载数据的功能,整合后就是模型1. NSThread + connection + delegateObject;

有问题吗,有,线程并发控制难以控制,那么我们就如何更改这个呢,将NStread 换成NSOperation的子类,然后用NSOperation的子类替换delegateObject,那么这样还有一个问题,NSOperation如何控制并发呢,所以我们还缺少NSOpreationQueue。NSOpreationQueue来管理NSOperation,这样并发就成功了。

整理后为模型2 NSOperation + connnetion + NSOperationQueue

模型2已经很好了,但是还有一个问题,就是 NSOperationQueue在分配一个线程去执行connection,然后load完成后,在后通知这个线程,并调用代理函数执行任务,但是一般情况下,load过程比较慢,系统中会停留一些 NSOperation执行线程,并且什么任务都不做,就是等待,所以很浪费。所以,我们这样考虑,当 NSOperationQueue分配一个线程执行NSoperation的时候我们在执行时候,让NSoperation去通知一个共有的线程去执行NSoperation的加载方法,那么NSURLConnection在加载完成后会通知调用线程,这个时候就是这个共有线程,那么其他线程就执行完成然后得以释放解脱,只有一个共有线程在忙碌,这样就不会有浪费。ok第三种模型出现了

NSOperation + connnetion + NSOperationQueue + COMMENThread

模型三就是AF采用设计方法。

原创粉丝点击