ios中AFUrlConnection 和AFsession区别以及相关原理

AFNetworking 1.0是建立在NSURLConnection的基础API上的 。

AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。

在AFNetworking3.0中下面这些类已被废弃:AFURLConnectionOperation,AFHTTPRequestOperation,AFHTTPRequestOperationManager。

这些类包含基于NSURLConnection的API的内部实现,他们已经被使用NSURLSession重构:UIImageView+AFNetworking,UIWebView+AFNetworking,UIButton+AFNetworking。


主要框架:网络通信模块NSUrlSession,网络状态监听模块:Reachability,网络通信安全模块:Security,网络通信序列化模块:Serialization,对UIKit扩展部分:UiKit。。

 AFNetworking3.0实现机制

AFNetworking 3.0 实现完全基于NSURLSessionTask进行封装,NSURLSessionTask 是苹果在iOS7 推出的网络请求api。AF支持https,网络数据请求,文件上传,文件下载,监听手机网络状态。AFHttpSessionManager 继承 AFURLSessionManager 对网络请求进行管理,使用AFURLRequestSerialization 对网络请求进行封装,使用AFURLReponseSerialization 响应体进行处理,使用AFSecurityPolicy 对服务器证书进行校验。支持https协议,支持本地证书和服务器证书进行对比验证,AF要求ios7或以上系统。AF数据传递主要使用block 和 notifacation的方式。

AFHTTPRequestOperationManager原理:

初始化manager之后,请求方式和解析方式设置了默认值,也可以修改为自己的请求方式和解析方式,然后会将当前任务添加进操作队列。AFHTTPRequestOperation继承AFURLConnection,并且实现了相关的代理。当operation启动的时候start方法被调用,operationDIdstart方法会在【self class】返回线程中被调用。。这个新的小线程即AFNetworking,他在创建的时候就启动了一个runloop事件循环,并添加了一个NSMachPort空端口,其目的就是用来维护runloop的执行不被退出。当网络请求数据到达的时候,网络请求是个异步的过程,当网络请求数据流到达的时候,runloop会监听到事件源。。AFUrlConnectionOperation中的代理方法receive data也会被调用,网络数据流也会写进缓存,写入缓存完成后,didfinishloading会调用,self.state=AFOperationFinishedState,表示该请求任务已经请求,而这个操作还坐了一个KVO操作,方法监听state状态改变,然后回归主线程,AFURLConnectionOperation中setCompletionBlock方法被回调。。self.completionBlock中内容被执行,这里边id responseObject = self.responseObject获得解析数据,将stream中的数据解析成Json、xml,然后AFHTTPRequestOperation方法setCompletionBlockWithSuccess一回调。通常这个success block做我们自己处理的。


AFHTTPSessionManager原理:

苹果已经对NSURLSessionDataTask做了高度封装,原理跟AFURLConectionOperation差不多,到一个网络数据流到达的时候,NSURLSession的URLSession:direceivedata方法就会被激活。AFURLSessionManager实现了NSURLSession的代理,AFURLSessionMnager代理方法会被调用。这样网络数据就被写入self.mutableData,当数据获取完成之后URLSession:task:didcompleteWithError方法会调用,data=【self.mutabledata copy】,网络数据会被copy到data中,网络数据解析成了我们最终获取到的数据。。self.completionHandler执行代码块就回到了AFHTTPSessionManager的方法success  failure block就会被调用。

你可能感兴趣的:(ios中AFUrlConnection 和AFsession区别以及相关原理)