AFNetworking 与 NSURLSession
转载自:http://blog.sina.com.cn/s/blog_8157560c0101kt7h.html
1. 也就是说在IOS 7.1 之后你想用网络请求的话有两种途径,NSUrlSession, 想要兼容旧版本的话,可以就NSUrlConnetion
2. 如果想要上传数据的话,可以用NSURLRequest 包装上传的内容,再利用NSURLSession\NSURLConncetion
NSURLSession 使用时要确定三个条件: type of Session, type of task, isForeground, session 创建时是根据一个config类来生成的。
1.)三种类型session. 默认的session类型,它会利用磁盘将url认证信息存储在用户钥匙串中,临时session类则不会存储,一旦程序出问题,它就会抛出清空当前url信息; 最后一种是后台session,类型默认类型。
2.)任务类型则有三种,数据型任务,它是临时性操作,进行request的发送与接收是利用以NSData类,也因此不支持bg(后台)session.下载任务,上传任务:这两种支持后台session操作,当程序在后台运行时,仍然可以进行数据的上传与下载。
当程序进入后台时会调用AppDelegate的 application:handleEventsForBackgroundURLSession:completionHandler: 方法,app会自动存储session的唯一标识;当程序从后台唤醒的时候,就会以该identifier创建一个background session configuration;
因此,为每一个url session 设定一个唯一标识,对于background session和 target 来说是must be
NSURLSession 的生命周期。苹果提供了两种使用途径,一是利用系统的delegate,另一种就是自定义回调方法了;
那什么时候用Session呢??
1.使用后台会话,而你的应用程序没有运行下载或上传的内容。
2.执行自定义身份验证。
3.执行自定义的SSL证书验证。
4.决定传输是否应该下载到磁盘或显示基于由所述服务器或其他类似标准所返回的MIME类型。
5.通过request body stream(而不是一个NSData对象)上载数据。
6.限制缓存编程。
7.限制HTTP重定向编程。
以下是苹果官网的示例代码:
NSURL *URL = [NSURL URLWithString: TouTiaoInfoList(page)];
//每一个request都保存请求后的Cache, per-app basis, NSURLConnection则以cachePolicy 进行查询
NSURLRequest *theRequest=[NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
// 创建一个NSMutableData
_receivedData = [NSMutableData dataWithCapacity: 0];
// create the connection with the request,start loading the data
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (!theConnection) {
_receivedData = nil; // Release the receivedData object.
// Inform 失败了声明一下进行处理;
}
// [NSURLConnection sendAsynchronousRequest:theRequest queue:[[NSOperationQueue alloc] init]
// completionHandler:^(NSURLResponse* response, NSData* data, NSError* connectionError){
// NSLog(@"response %@, \n%@", response, data);
// }];
// NSURLCredential *credential = [ NSURLCredential credentialWithUser:@"halo"
// password:@"121212" persistence:NSURLCredentialPersistenceForSession];
//
// NSURLResponse *response = [NSURLResponse alloc];
}
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)[cachedResponse response];
// Look up the cache policy used in our request
if([connection currentRequest].cachePolicy == NSURLRequestUseProtocolCachePolicy) {
NSDictionary *headers = [httpResponse allHeaderFields];
NSString *cacheControl = [headers valueForKey:@"Cache-Control"];
NSString *expires = [headers valueForKey:@"Expires"];
if((cacheControl == nil) && (expires == nil)) {
NSLog(@"server does not provide expiration information and we are using NSURLRequestUseProtocolCachePolicy");
return nil; // don't cache this
}
}
return cachedResponse;
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
_receivedData = nil;
NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription],
[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
[_receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// [_receivedData setLength:0];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Succeeded! Received %d bytes of data",[_receivedData length]);
connection = nil;
_receivedData = nil;
}
关于AFNetworking 框架的使用; 2.0
2.0 最大的改变就是支持了NSURLSession 的使用,这个是苹果在新的7,0 推出用于替代,10年前的网络请求框架,NSURLConnection;
由于NSURLConnection 是包括了对于会话管理,高速缓存策略,cookie存储和URL协议的大范围的设置,而在NSURLSession中利用particular configuration,
配置请求方式,缓存的方法,从而实现fetch data, and upload or download files
对于AF 来说最大的变化就是对请求内容negotiation and serialisation , 在之前对于请求响应使用的是 AFHTTPRequestOperation 与其子类,对于特殊的请求使用setCompletionBlockWithSuccess:failure: 在2.0 之后所有请求均使用AFURLResponseSerialization; 同时系列化的概念也延伸至request(用来解耦对于AFHTTPClient的依赖) 通过使用 AFURLRequestSerialization;
这两种系列化 只要调两个方法
- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
withParameters:(NSDictionary *)parameters
error:(NSError *__autoreleasing *)error
- (id)responseObjectForResponse:(NSURLResponse *)response
data:(NSData *)data
error:(NSError *__autoreleasing *)error
对于非常规的request 方法(常规: HTTPMethodsEncodingParametersInURI), AFJSONResponseSerializer 能够自动将request body 进行系列化,对于request的参数可以通过AFPropertyListSerializer
来进行
由于在早期版来中AFHTTPClient 做了太多的事情: 创建请求, 多任务字节流的创建,队列,队列管理,系列化,批队列,以及网络连接检查等;
现在有了对NSURLConnection 和NSURLSession的管理类AFHTTPRequestOperationManager和AFHTTPSessionManager其它功能被细分到serialization, security, and network reachability monitoring.
在2.0之后会对每一个baseURL配置一个网络状态监听;
用法:
HTTPRequest Operation Manager 它封装了http request 和 response 的系列化, 网络状态的监听(具体可以参考apple 网络监听类)
这里特殊说明的是关于文件post 请求做了什么事情以及它与普通的URL表单的编码post请求的区别。 这里重要的区别就是在于:
POST:parameters:constructingBodyWithBlock:success:failure:
这里的文件post如图片,文档的上传等,
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<</b>AFMultipartFormData> formData) {
[formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
而对于NSURLSessionManager 主要是对iOS 6之后出现的NSURLSession 类的封装,NSURLSession类是以配置文件对象, NSURLSessionConfiguration 来初始化生成url 请求。具体关于Session类可以看苹果官网; 最后将网络请求交予一个NSURLSessionDownloadTask
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]];
return [documentsDirectoryPath URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];
AFNetworking 与 NSURLSession的更多相关文章
- [翻译] Working with NSURLSession: AFNetworking 2.0
Working with NSURLSession: AFNetworking 2.0 简单翻译,有很多错误,看官无法理解处请英文原文对照. http://code.tutsplus.com/tu ...
- Cocoa Touch(五):网络请求 NSURLSession/AFNetworking, GCD, NSURLResquest
NSURLRequest 网络请求的关键的就是NSURLRequest类,它的实例表示了请求报文实体以及请求的缓存策略等等,各种网络框架的最终目标都是把这个对象编译成为请求报文发送出去.下面用一个实例 ...
- iOS7 中的新加入的下载类NSURLSession(随ios版本更新而更新)
想详细的了解网络下载的相关知识,要仔细阅读URL Loading System Programming Guide 这里有篇好文章(http://www.shinobicontrols.com/blo ...
- AFNetworking源码分析
来源:zongmumask 链接:http://www.jianshu.com/p/8eac5b1975de 简述 在iOS开发中,与直接使用苹果框架中提供的NSURLConnection或NSURL ...
- 网络方案 & HTTP状态码
在iOS中,常见的发送HTTP请求的方案包括: 苹果官方 名称 说明 NSURLConnection iOS 2.0 推出,用法简单,最古老最经典最直接的一种方案 NSURLSession iOS 7 ...
- iOS 串行网络请求。。。待研究
nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...
- iOS开发笔记4:HTTP网络通信及网络编程
这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...
- iOS网络编程总结
好长时间没有进行更行了,最近学到AFNetworking框架,在学习完成之后做出一个总结 1.第三方网络的框架 AFNEtworking使用简单,对最新的iOS特性都有很好的支持,对NSURL进行了封 ...
- NSURLSession使用模板和AFNetworking使用模板(REST风格)
1.NSURLSession使用模板 NSURLSession是苹果ios7后提供的api,用来替换 NSURLConnection会话指的是程序和服务器的通信对象//一.简单会话不可以配合会话(ge ...
随机推荐
- BZOJ 1202 狡猾的商人
前缀和+带权并查集. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
- 【Django】Python虚拟环境工具virtualenv
教程 第一步:安装virtualenv $pip install virtualenv 第二步:开启虚拟环境的python $cd ENV/Scripts $activate.bat #启用virtu ...
- EIG集团简单介绍
有朋友会问为什么要介绍EIG集团,他们是干什么的?与域名.主机.IDC行业资讯等有啥关系?EIG集团很牛逼么?带着这些疑问,简单的给大家做个介绍,希望能帮助大家了解这个IDC行业里面的“魔鬼”! EI ...
- phonegap修改软件名称和图标
修改app 图标 打开AndroidManifest.xml文件 修改application 节点 <application android:allowBackup="true&quo ...
- JVM——类的加载过程
附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...
- 微信支付-JSAPI支付V3-查询退款
接口地址 接口链接:https://api.mch.weixin.qq.com/pay/refundquery 是否需要证书 不需要. 请求参数 字段名 变量名 必填 类型 示例值 描述 公众账号ID ...
- 25个有用的jQuery日历和日期选取插件
jQuery被认为是最好的JavaScript库,因为它简单易用.灵活,并有大量的插件.本文介绍25个非常不错的jQuery日历和日期选取插件,希望对各位有用. 1. Simple JQuery Da ...
- 使用json格式的数据进行通信
4 Java对象转换成JSON 4.1 问题 将Java对象转换成符合JSON格式的字符串,并测试. 4.2 方案 使用与json-lib.jar相关的jar文件完成类型的转换. 4.3 步骤 步骤一 ...
- XAML概览 1(译自JeremyBytes.com)
(文章译自JeremyBytes.com,由于原文太长,故分成几篇,能力所限,如有疏漏,希望海涵.另外若有侵权,务必尽快告知) Overview 了解XAML (可扩展应用程序标记语言)是使用WPF和 ...
- Python cookbook-读书笔记01
1 数据结构和算法 1.1 Unpacking a sequence into separate variable(解包,赋值) >>> data = [ 'ACME', 50, 9 ...