转载自: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的管理类AFHTTPRequestOperationManagerAFHTTPSessionManager其它功能被细分到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的更多相关文章

  1. [翻译] Working with NSURLSession: AFNetworking 2.0

    Working with NSURLSession: AFNetworking 2.0   简单翻译,有很多错误,看官无法理解处请英文原文对照. http://code.tutsplus.com/tu ...

  2. Cocoa Touch(五):网络请求 NSURLSession/AFNetworking, GCD, NSURLResquest

    NSURLRequest 网络请求的关键的就是NSURLRequest类,它的实例表示了请求报文实体以及请求的缓存策略等等,各种网络框架的最终目标都是把这个对象编译成为请求报文发送出去.下面用一个实例 ...

  3. iOS7 中的新加入的下载类NSURLSession(随ios版本更新而更新)

    想详细的了解网络下载的相关知识,要仔细阅读URL Loading System Programming Guide 这里有篇好文章(http://www.shinobicontrols.com/blo ...

  4. AFNetworking源码分析

    来源:zongmumask 链接:http://www.jianshu.com/p/8eac5b1975de 简述 在iOS开发中,与直接使用苹果框架中提供的NSURLConnection或NSURL ...

  5. 网络方案 & HTTP状态码

    在iOS中,常见的发送HTTP请求的方案包括: 苹果官方 名称 说明 NSURLConnection iOS 2.0 推出,用法简单,最古老最经典最直接的一种方案 NSURLSession iOS 7 ...

  6. iOS 串行网络请求。。。待研究

    nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...

  7. iOS开发笔记4:HTTP网络通信及网络编程

    这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...

  8. iOS网络编程总结

    好长时间没有进行更行了,最近学到AFNetworking框架,在学习完成之后做出一个总结 1.第三方网络的框架 AFNEtworking使用简单,对最新的iOS特性都有很好的支持,对NSURL进行了封 ...

  9. NSURLSession使用模板和AFNetworking使用模板(REST风格)

    1.NSURLSession使用模板 NSURLSession是苹果ios7后提供的api,用来替换 NSURLConnection会话指的是程序和服务器的通信对象//一.简单会话不可以配合会话(ge ...

随机推荐

  1. 【转】 ARM Linux 3.x的设备树(Device Tree)

    1.    ARM Device Tree起源 http://blog.csdn.net/21cnbao/article/details/8457546 Linus Torvalds在2011年3月1 ...

  2. BZOJ 4552 排序

    省选TM都能有BC原题? ... #include<iostream> #include<cstdio> #include<cstring> #include< ...

  3. C# list installed softwares

    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Product&q ...

  4. 学习java之HashMap和TreeMap

    HashMap和TreeMap是Map接口的两种实现,ArrayDeque和LinkedList是Queue接口的两种实现方式.下面的代码是我今天学习这四个数据结构之后写的.还是不熟悉,TreeMap ...

  5. 【英语】Bingo口语笔记(38) - See系列

    see somebody off 送别 see somebody out 看到谁从哪里出来

  6. textile

    textile 编辑   Textile是一个人性化的Web文本生成器,以简洁的方式提供HTML标签功能. 目录 1内容 ▪ 短语修饰符 ▪ 块修饰符 ▪ 链接 ▪ 属性 ▪ 排列 ▪ 表格 ▪ 图像 ...

  7. springmvc 入门级教程

    1.先看下目录结构 2.引用所需的jar文件 3.web.xml 配置如下 <?xml version="1.0" encoding="UTF-8"?&g ...

  8. 经典排序算法(Java版)

    1.冒泡排序 Bubble Sort 最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡” ...

  9. DOS攻击和DDOS攻击有啥区别啊

    DDOS是DOS攻击中的一种方法. DoS:是Denial of Service的简称,即拒绝服务,不是DOS操作系统,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务. ...

  10. nginx 的模块及处理流程

         nginx的内部结构是由核心部分和一系列的功能模块所组成.这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展.这样的模块化设计类似于面向对象中的接口类,它增强了 ...