文章标题
来源:互联网 发布: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采用设计方法。
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 《图解HTTP[上野宣]》读书笔记六-8
- 深入理解 JavaScript 异步系列(5)—— async await
- 快速搭建基于beanstalk的php消息队列服务
- Android开发java jdk环境变量配置
- pandas中apply函数的用法
- 文章标题
- 剑指Offer-5:替换字符串的空格
- 数据库中字段类型nvarchar和varchar的区别
- Oracle 11g 中 Direct path reads 特性 说明
- 数据结构实验之查找四:二分查找
- 润乾报表参数不同展现报表不同
- 表白墙源码 [详细说明版]
- 判断线程池中的线程是否全部执行完毕
- 剑指offer—滑动窗口的最大值