AFN小记

一、AFN和ASI的区别
ASI的使用参照文顶顶的
http://www.cnblogs.com/wendingding/p/3950027.html

1.底层实现
1> AFN的底层基于OC的NSURLConnection和NSURLSession
2> ASI的底层基于纯C语言的CFNetwork框架
3> ASI的运行性能 高于 AFN

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

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

2> AFN提供了多种对服务器数据处理的方式

* JSON处理
* XML处理
* 其他处理

3.监听请求的过程
1> AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)
* success : 请求成功后调用
* failure : 请求失败后调用

2> ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
* 成为代理,遵守协议,实现协议中的代理方法
* 成为代理,不遵守协议,自定义代理方法
* 设置block

4.在文件下载和文件上传的使用难易度
1> AFN
* 不容易监听下载进度和上传进度
* 不容易实现断点续传
* 一般只用来下载不大的文件

2> ASI
* 非常容易实现下载和上传
* 非常容易监听下载进度和上传进度
* 非常容易实现断点续传
* 下载或大或小的文件都行

5.ASI提供了更多的实用功能

1> 控制圈圈要不要在请求过程中转

2> 可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
3> 可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
* 暂停\恢复\取消所有的请求
* 监听整个队列中所有请求的下载进度和上传进度
AFN和ASI的对比的参照图
http://wenku.baidu.com/link?url=PAzbEWzLxF9U499tWk9h_9ekrAr27O3_OeyGYaBUL4K6EbHn3VMYahbEkoIwzXxC3mWfvhCROQmW8uyiXJhWAcct6Y9KATNPHACZfDPt2US

二.AFN介绍

1.AFHTTPRequestOperationManager是对NSURLConnection的封装
以下是AFN内部的原话,所以AFHTTPRequestOperationManager已经过时了,现在大多用AFHTTPSessionManager
/*
For developers targeting iOS 6 or Mac OS X 10.8 or earlier,AFHTTPRequestOperationManager` may be used to similar effect.
要开发 iOS 6 或 Mac OS X 10.8 之前版本,建议使用
*/
2.AFHTTPSessionManager对NSURLSession的封装

3.AFN2.0和3.0的比较
AFN2.0
.对NSURLSession的封装,
.对AFURLConnection的封装,
.对HTTPS网络安全请求做了一个包装,
.做了一个网络连接管理的一个包装,
AFN3.0
添加进度回调
去掉所有AFURLConnection
4.AFN功能简介
AFN 主要用来发送网络请求
AFNetworkReachabilityManager :用来实时监测当前网络状态的!
AFSecurityPolicy :安全策略:支持 HTTPS 请求.
如何在AFN中使用HTTPS的请求参照以下资料
http://blog.csdn.net/doubleuto/article/details/42154109

5.AFN发送网络请求时的注意点
.默认的使用JSON解析器解析JSON数据,返回的默认就是 JSON 解析之后的数据!
.网络请求成功后默认回到主线程
.插入数据的格式
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript" ,@"text/plain",nil];
.发送网络请求里面的参数说明
// parameters :参数字典
// progress :进度. AFN 3.0 之后推出的. 没有任何用处!
// success :成功回调.{成功的要求: 1.网络请求成功; 2.服务器返回的必须是 JSON 数据; 3.自己(AFN)还能够解析 JSON数据}

6.AFN中解析器的类型,返回的数据类型,所能解析的数据
要根据服务器返回的数据类型,选择合适的解析器类型!
// 1. JSON 解析器: JSON 解析之后的数据. ------ JSON
manager.responseSerializer = [AFJSONResponseSerializer serializer];

// 2. XML 解析器: NSXMLParser ------ XML/默认是 SAX 解析.
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 3. 万能解析器: NSData 数据. ----- JSON /XML /HTML /各种文件...
// 对于文件/图片/视频/网页HTML,只能选择 万能解析器!
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

7.利用AFN检测网络状态的步骤
. 实例化网络工具监测类.
. 设置网络状态改变之后的操作.
.开启网络监测

三.AFN对文件的上传和下载

1.文件上传的注意事项
AFN 只支持单文件上传!默认将后台传回的JSON数据解析成OC的数据类型.

步骤:
.拼接本地文件的路径,以file://,注意如果路径中有汉字要用以下方法转义
stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]
.发送file请求(同步)获得文件的类型名字(url:统一资源定位符. http:// 网络资源 file://本地资源)
.AFN发送post请求上传文件
/*
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
*/
.constructingBodyWithBlock内封装form表单
// name: 服务器接收文件参数的 key 值.
// fileName: 上传文件在服务器中保存的名称.
// mimeType: 上传文件的文件类型.
[form appendPartWithFileURL:url name:@"userfile" fileName:@"w" mimeType:response.MIMEType error:NULL];
注意:通过form表单追加文件是不能实现多文件上传的

2.AFN实现文件的下载

// 执行下载文件的方法,可以监控下载进度
- (void)downLoadMonitor
{
// 声明一个进度对象
NSProgress *progress = nil;
// 1.创建网络管理者
// AFHTTPSessionManager 基于NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 2.利用网络管理者下载数据
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost.video.zip"]];
/*
destination
- targetPath: 系统给我们自动写入的文件路径
- block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
completionHandler
- url :destination返回的URL == block的返回的路径
*/
/*
@property int64_t totalUnitCount; 需要下载文件的总大小
@property int64_t completedUnitCount; 当前已经下载的大小
*/

NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
// NSLog(path);
return [NSURL fileURLWithPath:path];

} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@",filePath.absoluteString);

}];

/*
要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
@property int64_t totalUnitCount; 总单位数
@property int64_t completedUnitCount; 完成单位数
*/
// 给Progress添加监听 KVO
// [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

// 3.启动任务
[downTask resume];

}

下面是使用KVO监听下载进度

// 执行下载文件的方法,可以监控下载进度
- (void)downLoadMonitor
{
// 声明一个进度对象
NSProgress *progress = nil;
// 1.创建网络管理者
// AFHTTPSessionManager 基于NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 2.利用网络管理者下载数据
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost.video.zip"]];
/*
destination
- targetPath: 系统给我们自动写入的文件路径
- block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
completionHandler
- url :destination返回的URL == block的返回的路径
*/
/*
@property int64_t totalUnitCount; 需要下载文件的总大小
@property int64_t completedUnitCount; 当前已经下载的大小
*/

NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
// NSLog(path);
return [NSURL fileURLWithPath:path];

} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@",filePath.absoluteString);

}];

/*
要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
@property int64_t totalUnitCount; 总单位数
@property int64_t completedUnitCount; 完成单位数
*/
// 给Progress添加监听 KVO
// [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

// 3.启动任务
[downTask resume];

}

时间: 2024-10-22 23:20:35

AFN小记的相关文章

SpringBoot - 二零一七0421小记

一.SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个: @Controller + @ResponseBody = SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端 @RequestMapping(value={"/hello","/hi"},method=RequestMe

AFN的简单二次封装

可用于登陆,注册,修改密码,获得手机验证码. 首先导入AFN第三方库 NetWorkTool.h // NetWorkTool.h // 网络请求 // // Created by 丁云飞 on 15/11/8. // Copyright © 2015年 DLS. All rights reserved. // #import <Foundation/Foundation.h> #import "AFNetworking.h" @protocol netWorkToolDe

广州postgresql用户会技术交流会小记 2015-9-19

广州postgresql用户会技术交流会小记  2015-9-19 今天去了广州postgresql用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用postgresql -X2的情况 第二个讲师介绍了postgresql里面的一些执行计划分析 我个人比较关注第一个session,因为涉及到真正的应用案例 网上有对postgresql -X2的简短介绍,我先转载过来 转载:http://francs3.blog.163.com/blog/static/405767272

git 学习小记之记住https方式推送密码

昨天刚刚学了点git基础操作,但是不幸的是[email protected]给出公告说尽量使用 https 进行操作.可是在用 https 进行 push 时,都需要输入帐号和密码. 各种百度谷歌之后在[email protected]官网找到了解决方法<https方式使用[email protected]设置密码的方式>文中给出了几个方法,并且都非常简单. 关于 cache 缓存方式,我不太喜欢,因为要设置时间,而且会过期.而 store 相应的非常方便,设置全局后,方便多个库使用.当然如果

关于自动化部署之docker容器的折腾小记

docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的.可移植的.自管理的组件,这种组件可以在你的latop上开发.调试.运行,最终非常方便和一致地运行在production环境下. 具体什么是docker,你们自己找资料吧,应该好理解.   可以说是个运维的利器,可以把

安卓环境搭建小记

安装容易出现问题:1.更新sdk时可能无法连接服务器,可在C:\WINDOWS\system32\drivers\etc下的hosts文件最后添加:#Google主页203.208.46.146 www.google.com#这行是为了方便打开Android开发官网 现在好像不翻墙也可以打开74.125.113.121 developer.android.com#更新的内容从以下地址下载203.208.46.146 dl.google.com203.208.46.146 dl-ssl.googl

与webView进行交互,webView小记

本文转载至 http://www.verydemo.com/demo_c101_i46895.html 一.与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号(双引号需要进行转义在转义字符前加\),在传递json字符串时不需要加单引号或双引号. 1 -(void)webViewDidFinishLoad:(UIWebView *)webView 2 { 3     NSString *sendJsStr=[NSString stringWithFormat

AFN的使用(待整理)

待整理 一.文件下载 1.创建下载 //1.创建会话管理者 AFHTTPSessionManager *manager =[AFHTTPSessionManager manager]; NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"]; NSURLRequest *request = [NSURLRequest requestWithURL:u

ios开发网络学习AFN框架的使用一:get和post请求

#import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self post]; } -(void)get { //1.创建会