一、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];
}