AFNetworking 网络库

源码阅读学习:
参考源码解读:http://www.jianshu.com/p/c36159094e24
底层原理分析:

  • AFNetWorking是对NSURLSession的封装
  • AFHTTPRequestOperationManager :内部封装的是 NSUrlConnection,负责发送网络请求,使用最多的一个类.(3.0废弃)
  • AFHTTPSessionManager :内部封装是 NSUrlSession ,负责发送网络请求,使用最多的一个类.
  • AFHTTPRequestOperationManager 和 AFHTTPSessionManager :定义的 API(方法名称)是一模一样,没有任何区别.
  • AFNetworkReachabilityManager :实时监测网络状态的工具类.当前的网络环境发生改变之后,这个工具类就可以检测到.
  • AFSecurityPolicy :网络安全的工具类, 主要是针对 HTTPS 服务.
  • AFURLRequestSerialization :序列化工具类,基类.上传的数据转换成JSON格式(AFJSONRequestSerializer).使用不多.
  • AFURLResponseSerialization :反序列化工具类;基类.使用比较多:
    AFJSONResponseSerializer; JSON解析器,默认的解析器.
  • AFHTTPResponseSerializer; 万能解析器; JSON和XML之外的数据类型,直接返回二进制数据.对服务器返回的数据不做任何处理.
    AFXMLParserResponseSerializer; XML解析器;

AFM默认超时时长是:60秒

断点续传:

  • 检查服务器文件信息
  • 检查本地文件
  • 如果本地比服务器文件小,断点续传,利用HTTP请求头的Range实现断点续传
  • 如果比服务器文件大,重新下载
  • 大小一致,下载完成

文档参考

AFNetworking Docs
Apple - URL Session Programming Guide

由 NSURLConnection 转为 NSURLSession 了;
使用 session task 来进行数据请求;

代码结构

Paste_Image.png
  • AFHTTPSessionManager :AFURLSessionManager
    默认使用request与response的序列化方式是: HTTP Serializer与JSON Serializer,用于在POST multipart时候使用;//发送及接收数据前的处理;
    是对NSURLSession的封装处理,提供设置回调函数接口;
    处理session的delegate,处理session task的delegate;
    how to use AFHTTPSessionManager?
    GET --> create NSURLSessionDataTask -> dataTask resume

  • SecurityPolicy
    AFSecurityPolicy evaluates server trust against pinned X.509 certificates and public keys over secure connections.
    使用 Security系统库
    用于HTTPS的secure连接请求;
    判断请求的证书是否可信;分为 证书/公钥 两种:
    AFSSLPinningModePublicKey 、AFSSLPinningModeCertificate
    evaluateServerTrust 流程:
    读取本地公钥的key文件;
    提取pulickey 或者 certificate 信息;
    检查域名有效,创建policy,检测server是否值得信任;
    如果是None模式:检测证书可信性;
    如果是证书模式:检测证书是否与设置过的相匹配;
    如果是公钥模式:提取发送过来的公钥,检查是否与本地的key有相同的,如果有相同就返回YES;
    --> 验证证书成功后,URLSession会使用证书进行下一步通信处理;

  • Reachability
    是对系统SystemConfiguration库中的SCNetWorkReachability的封装;
    提供监听网络状态,判断网络是否连接的接口;
    设计:将网络状态转换为wifi与wwan两种形式,并对网络变化提供消息通知处理;
    在main loop中,schedule一个任务,用于网络状态监控;
    网络状态变化,发送通知消息;
    区分ipv4/ipv6的参数创建;

  • Request/Response Serializer
    根据不同子类的serializer实现,对请求数据进行重新组织,行程字典格式或者json格式等参数内容;
    对请求数据进行处理,编码
    对请求的header及类型等http信息就行处理
    multipart请求的处理(要上传文件需要使用)
    Response serializer对返回数据进行解析(JSON/XML/PropertyList/Image/Compound)处理,检查有效性并提取数据进行分装;

  • example 示例 使用结构设计:
    model模块,负责请求及处理数据
    controller模块,负责控制view显示数据及协议实现,用户交互
    view模块,负责显示数据

  • UIWebView+AFNetworking
    UIWebView 类别,使用了runtime
    一个运行时属性变量,使用了objc_set/getAssociateObject对属性进行读写;
    一个session manager属性变量,也使用运行时函数进行读写;//使用了dispatch_once创建静态变量
    二个load request函数
    __weak __typeof(self) weakSelf = self;
    session请求的返回及状态进度都是用代理模式处理;
    每一个session task对应一个delegate;

  • get 请求流程
    使用request serializer创建一个NSMutableURLRequest(设置NSURLRequest的参数及header,httpbody信息);
    使用NSURLRequest创建一个NSURLSessionDataTask(创建一个session task,设置delegate函数实现,根据task的identify存储对应的delegate对象);
    处理NSURLSession相关的delegate函数,调用task对应的代理对象对返回数据、错误、进度等信息进行回调处理;

  • data task 创建流程
    POST data task:

  1. 使用request searializer 创建post的 NSURLRequest;
  2. NSURLSession 调用 uploadTaskWithStreamedRequest 创建 NSURLSessionUploadTask;
  3. 给task添加对应的delegate并存到到字典中,用于task状态返回的处理;
  4. task resume 开始执行task;
  • NSURLSesssion task种类
    data task:
    upload task:
    download task:

  • 后台下载机制如何使用?
    当应用退出后,崩溃或者进程被关掉还是会运行;
    使用后台session配置,[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier];
    在NSURLSessionDownloadDelegate的didFinsh函数中,移动临时目录文件到应用的存储中;

使用相关技术

单例 dispatch_once
Core Foundation 使用,需要手动retain与release管理;
background task
runtime method swizzle
NSOperationQueue
递归锁 NSRecursiveLock
信号量 dispatch_semphore_t (signal +1, wait -1);
手动调用KVO通知,KVO的依赖
消息通知

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容