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 ...
随机推荐
- PDO防注入原理分析以及使用PDO的注意事项 (转)
我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...
- Android应用开发学习—Toast使用方法大全
Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最 ...
- 可接受多个值的文件上传字段HTML5新特性
<input type="file" id="input" multiple="multiple"> 主要是多了个multip ...
- DataGridView固定了列名,怎样将数据内容绑定在列上
留心驿站 原文 其实很简单,在DataGridView上右键选择编辑列,在数据一项中找到DataPropertyName,在里面写上对应的要绑定的数据中的字段名,即可 .比如:从数据库中选择的data ...
- cocos2dx+lua中cc.EventListenerMouse:create()的bug
今天在调试项目的时候用到了鼠标事件的监听 在创建事件监听器的时候出了问题 cc.EventListenerMouse:create() 这句返回值为nil 原来这是cocos2dx引擎的一个bug,t ...
- PHP.ini 配置文件解析
[PHP] ;;;;;;;;;;;;;;;;;;;; About php.ini ;;;;;;;;;;;;;;;;;;;;; PHP's initialization file, generall ...
- 将垃圾送入无底洞,顺便整理dev知识
相信用过Linux的童鞋们都用过crontab来做定时任务,不需要额外的安装程序和配置,一条简单的语句搞定定时任务,但是小伙伴们发现了没,如果你的定时任务执行频率很高而且会产生大量的输出的话,你的老爷 ...
- 软件推荐列表(Recommand Software)
1.Nutstore(https://jianguoyun.com/) Nutstore是一款云端同步软件.类似的有微软的OneDrive(旧名SkyDrive).Google Cloud Drive ...
- python 安装预编译库注意事项-pip
一般安装依赖库用pip install 库名 就可以,某些情况下依赖的库需要安装预编译好的, 可以参考pip 安装时的错误信息 下面这个链接中可以直接下载 http://www.lfd.uci.edu ...
- Pig Run on Hadoop, V1.0
——安装hadoop参考这篇blog: http://www.cnblogs.com/lanxuezaipiao/p/3525554.html?__=1a36 后面产生的问题,slave和master ...