因为项目中需要用到一些第三方框架来搞定基本需求,再次总结一番.我的项目是浏览器工具,所以对网络请求处理需要做很多特别处理,这也就构成了对AFN及ASI库的深究;

1.AFN全称为:AFNetWorking , 是一个构建在NSURLConnection,NSOperation以及其他熟悉的Founation技术之上的一个第三方网络框架.其对网络请求部分做了很好的封装,并且拥有良好架构,丰富的API,以及模块化构建方式;

2.AFN主要使用在2个场景中

(1):发送网络请求

(2):实时监测网络状态

AFHTTPRequestOperationManager:内部封装了NSUrlConnection,网络请求管理类,用来负责发送网络请求;

AFHTTPSessionManager :内部封装的是NSUrlSession,其内容同上,苹果推荐使用NSUrlsession;

两个网路请求管理类定义的API全完相同(此处限制于GET请求):

//⭐️NSUrlConnection--mark

[[AFHTTPRequestOperationManager manager] GET:nil parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

//⭐️NSUrlSession--mark

[[AFHTTPSessionManager manager] GET:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

} failure:^(NSURLSessionDataTask *task, NSError *error) {

}];主要的工具类:

AFNetworkReachabilityManager.h :实时监测网络状态改变的管理类.

AFSecurityPolicy.h :HTTPS 需要使用.

AFURLRequestSerialization:数据解析的时候会使用.

AFHTTPRequestSerializer: 万能解析器/对服务器返回的数据不做任务处理.

AFJSONResponseSerializer: JSON解析器.

AFXMLParserResponseSerializer: XML解析器.

AFHTTPRequestOperationManager :对NSURLConnection的封装.

AFHTTPSessionManager :对NSURLSession的封装.

一.\AFHTTPSessionManager 用法:

创建管理者:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

设置管理者的数据解析类型,默认为json格式的解析,可手动修改为其他类型,如XML:

manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

发送请求 <1.首先要明确发送的是什么类型的请求(GET/POST/HEAD...)

2. AFN3.0之后的网络接口比原来的多了一个参数-->网络进度>:

1.POST--mark

NSDictionary *dict = @{@"US":@"guerdan",@"PW":@"shushi"};

NSString * url = @"http://localhost/login/login.php";

[[AFHTTPSessionManager manager]POST:url parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {

//下载进度

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

//请求成功返回结果

NSLog(@"responseObject:%@",responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

//请求失败,打印错误

NSLog(@"error:%@",error);

}];

2.GET --mark

[[AFHTTPSessionManager manager] GET:url parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {

//下载进度

NSLog(@"%@",downloadProgress);

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

//请求成功返回结果

NSLog(@"responseObject:%@",responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

//请求失败,打印错误

NSLog(@"error:%@",error);

}];

参数:

URLString:网络接口地址;

Parameters:参数字典key:服务器接收普通参数的key值;

value:参数内容;

Progress:网络进度;

Success:成功回调;

Failure:失败回调;

⭐️::AFN是根据respone.MIMEType来判断服务器返回数据的类型.如果类型不匹配,但是又是JSON数据,解决方案:

1.改变解析器类型为:万能解析器 --> 手动解析JSON

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

2.改变判断条件的类型,从而使类型匹配,acceptableContentTypes默认情况下无 text/plain类型

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/plain",nil];

⚡️⚡️⚡️ 如果没有使用第三方框架(CocoaPods)来管理第三方框架,可以直接修改第三方框架的源代码.

一般在开发中,不要随意修改第三方源码.☔️☔️☔️

二\.AFHTTPRequestOperationManager -->省略啦~~

对服务器返回数据的解析:1.AFN可以自动对服务器返回的数据进行解析 --> 默认将服务器返回的数据当做JSON来解析

2.设置对服务器返回数据的解析方式

(1).当做JSON来解析

* mgr.responseSerializer = [AFJSONResponseSerializer serializer];

* responseObject的类型是NSDictionary或者NSArray

(2).当做是XML来解析

* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

* responseObject的类型是NSXMLParser

(3).直接返回Data ->告诉AFN不要去解析服务器返回的数据,保持原来的data即可

* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

3.waring

服务器返回的数据一定要跟ResponeSerializer对的上

三\.实时监测网络状态:

可以利用AFN实时监测网络状态:

AFNetworkReachabilityManager 实时检测网络状态改变的类

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

// 设置网络状态改变之后的操作

[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

// status :当前的网络状态.

// AFNetworkReachabilityStatusUnknown

// AFNetworkReachabilityStatusNotReachable

// AFNetworkReachabilityStatusReachableViaWWAN

// AFNetworkReachabilityStatusReachableViaWiFi

switch (status) {

case AFNetworkReachabilityStatusUnknown:

NSLog(@"未知的网络状态");

break;

case AFNetworkReachabilityStatusNotReachable:

NSLog(@"没有网络");

break;

case AFNetworkReachabilityStatusReachableViaWWAN:

NSLog(@"蜂窝移动网络");

break;

case AFNetworkReachabilityStatusReachableViaWiFi:

NSLog(@"WIFI网络");

break;

default:

break;

}

}];

// 开始检测网络状态

[manager startMonitoring];

四\.支持 HTTPS 网络安全传输协议下的访问

什么是HTTPS:

HTTPS = HTTP(超文本传输协议) + SSL (安全连接层) HTTP 的安全版本.

HTTPS会专门建立一个安全的数据传输通道来传输数据,外界拿不到任何数据,现阶段最安全的协议;目前在HTTP模式下三大运营商发送的恶意广告泛滥,并且可以获得用户的个人信息;HTTPS需要数字验证,目前很多大公司使用的数字验证都是默认支持的.

[manager GET:@"https://mail.itcast.cn" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {

//

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

NSData *data = responseObject;

//

NSLog(@"成功:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

//

NSLog(@"失败:%@",error);

}];

⚡️⚡️⚡️AFN默认情况下就是支持HTTPS访问的,但是如果用HTTPS的方式访问未受信任的网站便会报错,解决方案:

修改对SSL的检测:

AFN3.0之前:

manager.securityPolicy.allowInvalidCertificates = YES;

AFN3.0之后

manager.securityPolicy.validatesDomainName = NO;

☀️☀️☀️

五\.AFN和ASI的区别

1--首先对比两者的底层实现:

(1).AFN的底层基于OC的NSURLConnection和NSURLSesson

(2).ASI的底层则是基于纯C语言的CFNetWork框架

(3).ASI的运行性能要高于AFN

2--对服务器返回的数据处理:

(1).ASI没有直接提供对服务器数据处理的方式,直接返回data\string

(2).AFN提供了多种对服务数据的处理的方式

--mark JSON处理;

--mark XML处理;

--mark 其他处理;

3--监听请求的过程

(1).AFN提供了success和failure两个block来监听请求的过程(3.0之前只能监听成功和失败~~;3.0之后添加了进度)

--mark success:请求成功后调用

--mark failure:请求失败后调用

(2).ASI提供了3套方案,每一套方案都能监听请求的完整过程 -->(监听请求开始,接收到响应头信息,接收到具体数据,接收完毕,请求失败/成功)

--mark 成为代理.遵守协议,实现协议中的代理方法

--mark 成为代理,不遵守协议,自定义代理方法

--mark 设置block

3--文件下载和文件上传的使用难易程度

(1).AFN

--mark 不容易监听下载进度和上传进度

--mark 不容易实现断点续传

--mark 一般只用来下载不大的文件

(2).ASI

--mark 容易实现上传和下载

--mark 容易监听下载上传进度

--mark 容易实现断点续传

--mark 下载大文件/小文件都行

PS:ASI提供了更多的使用功能

(1):控制请求动画是否在请求过程中转;

(2):可以轻松设置请求之间的依赖:诶一个请求都是一个NSOperation对象

(3):可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理多有的请求对象)

--mark 暂停\恢复\取消所有的请求

--mark 监听整个队列中所有请求的下载/上传 进度

afn原理 ios_iOS开发:AFN的基本使用相关推荐

  1. afn原理 ios_IOS开发入门之iOS面试题- AFN2.x为什么添加一条常驻线程?

    本文将带你了解IOS开发入门iOS面试题- AFN2.x为什么添加一条常驻线程?,希望本文对大家学IOS有所帮助. 1.AFN2.x为什么添加一条常驻线程? AFN2.0里面把每一个网络请求的发起和解 ...

  2. afn原理 ios_iOS中AFN的基本使用

    AFN常用类 AFHTTPSessionManager//管理者发送请求 AFNetworkReachabilityManager//网络监测 get请求 //创建请求 AFHTTPSessionMa ...

  3. afn原理 ios_iOS AFNetworking网络框架详解

    导语: 众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网络通信类库,同时AFNetworking对苹果官方NSURLConnection和NSURLSession进行了封装,使 ...

  4. afn原理 ios_iOS AFN实现原理

    AFNetworking是封装的NSURLSession的网络请求 AFNetworking由五个模块组成: 分别由NSURLSession,Security,Reachability,Seriali ...

  5. 数据挖掘与分析 - 用JS实现推荐系统的原理与开发

    数据挖掘与分析 - 推荐系统的原理与开发 图表一览 试想一个推荐系统的应用场景 分析应用场景的需求 开始开发推荐图书系统 常规解决想法 曼哈顿距离 欧氏距离 闵可夫斯基距离 皮尔逊相关系数 余弦相似度 ...

  6. 嵌入式操作系统内核原理和开发

    嵌入式操作系统内核原理和开发(开篇) 操作系统是很多人每天必须打交道的东西,因为在你打开电脑的一刹那,随着bios自检结束,你的windows系统已经开始运行了.如果问大家操作系统是什么?可能有的人会 ...

  7. 嵌入式操作系统内核原理和开发(总结篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 很多朋友都喜欢嵌入式操作系统的内容,但是如何实现和仿真这样一个系统一直是困扰我们的难题.现在郑 ...

  8. 一文看懂汽车电子ECU bootloader工作原理及开发要点

    随着半导体技术的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设越来越多,存储器也越来越大.消费者对于汽车节能(经济和法规对排放的要求)型.舒适性.互联性.安全性(功能安全和信息安全)的要求越来 ...

  9. 利用外部中断实现清零_大工13春《嵌入式原理与开发》辅导资料十三

    大工13春<嵌入式原理与开发>辅导资料十三 2013-08-29 07:08:34 905 有学员问关于大工13春<嵌入式原理与开发>辅导资料十三的题目的参考答案和解析,具体如 ...

最新文章

  1. 搜索:广搜 词语阶梯
  2. .Net WEB打印需要设置的内容和方法
  3. svn trunk branches tags 的用法
  4. 科普:UTF-8 GBK UTF8 GB2312 之间的区别和关系
  5. linux下开启dhcp服务器配置,CentOS下DHCP服务器的配置
  6. Think in Java第四版 读书笔记3第七章第八章
  7. JSP的4大域对象及范围(简)
  8. C++ 20 进入倒计时,有哪些值得期待的新特性?
  9. 【Luogu】P2634聪聪可可(树形DP)
  10. 研磨设计模式——桥接模式
  11. 【电子产品】Fast FWR200 公司使用设备人数超过20个后,之后的设备无法上网
  12. 快速解决NVivo节点慢的问题!
  13. 微信支付开发 服务商模式 签名错误
  14. 怎么管理一个测试团队
  15. Linux 30岁,这些年经历了什么?
  16. IDEA中SVN项目不同颜色含义
  17. 头铁!我就硬钢算法岗!
  18. 机器学习吴恩达课程总结(五)
  19. 香港服务器能不能确保数据存储安全?
  20. mysql压缩包5.7.20安装_Mysql 5.7.20压缩版下载和安装简易教程

热门文章

  1. 词袋模型(bag of words)构建并使用主题模型(topic models)特征进行文本聚类分析(clustering analysis)实战
  2. 集成学习VotingClassifier、HistGradientBoostingClassifier、Stacking、Blending
  3. 什么是AWS Lambda?
  4. 目标检测+mAP+IoU
  5. mysql5.7数据库快照_lvm快照备份数据库(Mysql5.7)
  6. 如何把自己的经历写成小说_《诡秘小说》:读者与作者共同创作,难分真假,午夜不敢独自看!...
  7. The FBX plug-in does not support objects set to By Object mode in the Object Properties Display
  8. 【文本分类】Recurrent Convolutional Neural Networks for Text Classification
  9. 全排列:不含重复元素和含重复元素的全排列
  10. ubuntu16.0.4 opencv4.0.0 yolov3测试