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就会被调用。

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

推荐阅读更多精彩内容

  • 在苹果彻底弃用NSURLConnection之后自己总结的一个网上的内容,加上自己写的小Demo,很多都是借鉴网络...
    付寒宇阅读 4,345评论 2 13
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,733评论 2 7
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,225评论 30 472
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,300评论 1 23
  • 写在开头: 大概回忆下,之前我们讲了AFNetworking整个网络请求的流程,包括request的拼接,sess...
    涂耀辉阅读 20,003评论 53 315