昨天翻译了一篇《NSURLSession的使用》的文章,地址:http://www.cnblogs.com/JackieHoo/p/4995733.html,原文是来自苹果官方介绍NSURLSession技术实现网络请求的原理文章,文章中提到NSURLSession网络请求技术是NSURLSession这个新类和它相关类的套件集合。今天这篇文章,我就重点介绍下NSURLSession套件的几个重要类。

  首先我们看看下面这张图:

  从图中可以看出NSURLSession主要由NSURLSessionConfiguration以及一个可选代理组成。为了完成网络请求我们需要创建NSURLSessionTask对象。

NSURLSessionConfiguration

  NSURLSessionConfiguration有三种创建方式:

1.defaultSessionConfiguration

2.ephemeralSessionConfiguration

3.backgroundSessionConfiguration

  这三个方式我们在前文中已经有所介绍了,当我们创建了NSURLSessionConfiguration之后,我们还可以设置它的一些其他属性,比如下面的代码的几个常用属性:


NSURLSessionConfiguration *sessionConfig =

[NSURLSessionConfiguration defaultSessionConfiguration];

// 不允许移动网络,只允许WIFI操作网络请求。

sessionConfig.allowsCellularAccess = NO;

// 只允许接受json数据

[sessionConfig setHTTPAdditionalHeaders:

          @{@"Accept": @"application/json"}];

// 设置请求的超时时间为30秒

sessionConfig.timeoutIntervalForRequest = 30.0;

//设置资源处理的最长时间

sessionConfig.timeoutIntervalForResource = 60.0;

//设置app对单一主机的最大的连接数

sessionConfig.HTTPMaximumConnectionsPerHost = ;

  当然还有其他属性,您可以查看文档深入了解。

NSURLSession

  NSURLSession被设计来用来替代NSURLConnection技术的。会话通过它的任务NSURLSessionTask对象处理网络请求。使用NSURLSession你可以方便的使用带有block的方法、代理等。下面我们举一个例子:

// 百度图标的图片地址

NSString *imageUrl =

@"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";

// 会话配置设置为默认配置

NSURLSessionConfiguration *sessionConfig =

  [NSURLSessionConfiguration defaultSessionConfiguration];

// 使用默认配置初始化会话

NSURLSession *session =

  [NSURLSession sessionWithConfiguration:sessionConfig

                                delegate:self

                           delegateQueue:nil];

// 创建 下载图片任务

NSURLSessionDownloadTask *getImageTask =

[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]

    completionHandler:^(NSURL *location,

                        NSURLResponse *response,

                        NSError *error) {

// 图片下载完成执行的block,在这里我们处理图片

        UIImage *downloadedImage =

          [UIImage imageWithData:

              [NSData dataWithContentsOfURL:location]];

      //主线程更新界面

      dispatch_async(dispatch_get_main_queue(), ^{

        // 

        _imageView.image = downloadedImage;

      });

}];

// 记住,任务默认是挂起状态的,创建任务后,如果需要立即执行,需要调用resume方法

[getImageTask resume];

实现NSURLSessionDownloadDelegate

  我们可以实现这个代理方法,通知下载任务完成:

-(void)URLSession:(NSURLSession *)session

     downloadTask:(NSURLSessionDownloadTask *)downloadTask

didFinishDownloadingToURL:(NSURL *)location

{

  //下载完成时调用

}

  也可以实现这个代理来跟踪下载进度:


-(void)URLSession:(NSURLSession *)session

     downloadTask:(NSURLSessionDownloadTask *)downloadTask

     didWriteData:(int64_t)bytesWritten

totalBytesWritten:(int64_t)totalBytesWritten

totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

{

  NSLog(@"%f / %f", (double)totalBytesWritten,

    (double)totalBytesExpectedToWrite);

}

NSURLSessionTask

  我们常用NSURLSessionDataTask、NSURLSessionDownloadTask、NSURLSessionUploadTask任务,其实他们有一个共同的父类NSURLSessionTask。他们的继承关系入下图所示:

  图中已经明确说明了他们之间的继承关系,下面我们来介绍一下这个几个任务的不同作用:

NSURLSessionDataTask

  这个任务类是用来发器http的get请求,然后下载NSData类型的数据的。然后我们将数据转换成XML,JSON,UIImage,plist等对应的类型。使用方法如下:

NSURLSessionDataTask *jsonData = [session dataTaskWithURL:yourNSURL

      completionHandler:^(NSData *data,

                          NSURLResponse *response,

                          NSError *error) {

        // 我们在这例处理NSData为正确的数据类型

}];

NSURLSessionUploadTask

顾名思义,这个任务类主要是用来通过post和put上传数据到web服务器的。它的代理方法还可以允许程序了解网络传输状态的。下面示范一个上传图片的例子的使用方法:

NSData *imageData = UIImageJPEGRepresentation(image, 0.6);

NSURLSessionUploadTask *uploadTask =

  [upLoadSession uploadTaskWithRequest:request

                              fromData:imageData];

NSURLSessionDownloadTask

  NSURLSessionDownloadTask类湿的下载文件变的超级简单,并且让程序随时可以控制下载的暂停和启动。这个子类和前面的恋歌任务类稍微有点不同:

1.下载的内容写到一个临时文件中

2.在下载过程中会话会调用URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:方法更新状态信息。

3.当任务下载完成URLSession:downloadTask:didFinishDownloadingToURL:方法会被调用。这个时候我们最好将文件从临时位置移到一个永久位置,或者立即打开处理。

4.当下载失败或者取消时,程序可以获取的数据然后还可以继续恢复下载。

  这些特性非常有用有木有,不过千万要记住一点,所有这些任务默认创建时候是挂起的,如果要它们发挥作用,无比要执行resume方法,例如:

[uploadTask resume];

  好了,NSURLSession套件实现网络请求的技术需要用到的主要类就介绍到这里,下一篇文章,我将会通过一个完整例子来实战一下NSURLSession套件的使用,并实现网络请求。

介绍NSURLSession网络请求套件的更多相关文章

  1. NSURLSession网络请求

    个人感觉在网上很难找到很简单的网络请求.或许是我才疏学浅 ,  所有就有了下面这一段 , 虽然都是代码 , 但是全有注释 . //1/获取文件访问路径 NSString *path=@"ht ...

  2. iOS - NSURLSession 网络请求

    前言 NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) @interface NSURLSession : NSObject @available(iOS ...

  3. NSURLSession 网络请求

    1.NSURLSession 在 iOS9.0 之后,以前使用的 NSURLConnection 过期,苹果推荐使用 NSURLSession 来替换 NSURLConnection 完成网路请求相关 ...

  4. 第八篇、封装NSURLSession网络请求框架

    主要功能介绍: 1.GET请求操作 2.POST请求操作 1.处理params参数(例如拼接成:usename="123"&password="123" ...

  5. iOS - AFNetworking 网络请求

    前言 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的.但是,在绝大部分下我们所需要访 ...

  6. iOSAFNetworking 网络请求

    前言 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的.但是,在绝大部分下我们所需要访 ...

  7. CHNetRequest网络请求

    Paste JSON as Code • quicktype 软件的使用 iOS开发:官方自带的JSON使用 JSON 数据解析 XML 数据解析 Plist 数据解析 NetRequest 网络数据 ...

  8. IOS网络请求之NSURLSession使用

    前言: 无论是Android还是ios都离不开与服务器交互,这就必须用到网络请求,记得在2013年做iOS的时候那时候用的ASIHTTPRequest框架,现在重新捡起iOS的时候ASIHTTPReq ...

  9. iOS之网络请求NSURLSession剖析

    2013年的WWDC大会上,苹果推出了NSURLSession,对Foundation URL加载系统进行了彻底的重构,提供了更丰富的API来处理网络请求,如:支持http2.0协议.直接把数据下载到 ...

随机推荐

  1. 静态库冲突的解决办法:duplicate symbol

    昨天在做微信sdk和xmpp的集成,发现各自单独集成没问题,一起集成却总报错,百度了好一会儿才知道,这应该是库冲突造成的问题 然后参考了很多文章,跟着敲敲一遍,却发现问题多多,最后主要综合结合了这两个 ...

  2. matlab灰度变彩色+白平衡算法实现

    % matlab彩色图像分离通道并合并成处理后的彩色图像(彩色变灰度再变彩色) % 白平衡算法(灰度世界法)消除RGB受光照影响 clear all; close all; %读入原始图像 srcIm ...

  3. 最牛B的编码套路(转)

    转自:http://blog.csdn.net/happydeer/article/details/17023229 最近,我大量阅读了Steve Yegge的文章.其中有一篇叫"Pract ...

  4. ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)

    转自(http://blog.csdn.net/wyx100/article/details/8736445). struts1  处理流程是  jsp  -->  ActionForm 中的A ...

  5. mac 下 parallels 虚拟机 ubuntuServer 安装 parallels tools

    mac 下 parallels 虚拟机 ubuntuServer 安装 parallels tools 1. 先点击ubuntu 虚拟机右下角的设置 -----安装 parallels tools - ...

  6. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  7. Working with Data » 使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

    原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web applica ...

  8. VBA对象模型(1)

    关于对象和集合的比喻 Excel的基本单元是Workbook对象:在快餐连锁店中,基本的单元是单个餐馆.使用Excel可以添加工作簿和关闭工作簿,所有打开的工作簿组成了Workbooks集合(Work ...

  9. [svn] 分支开发

    参考博客: http://www.cnblogs.com/cxd4321/archive/2012/07/12/2588110.html (1)为什么要使用SVN分支开发和主干合并? 目的:在SVN下 ...

  10. hdu----(1528)Card Game Cheater(最大匹配/贪心)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...