介绍NSURLSession网络请求套件
昨天翻译了一篇《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网络请求套件的更多相关文章
- NSURLSession网络请求
个人感觉在网上很难找到很简单的网络请求.或许是我才疏学浅 , 所有就有了下面这一段 , 虽然都是代码 , 但是全有注释 . //1/获取文件访问路径 NSString *path=@"ht ...
- iOS - NSURLSession 网络请求
前言 NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) @interface NSURLSession : NSObject @available(iOS ...
- NSURLSession 网络请求
1.NSURLSession 在 iOS9.0 之后,以前使用的 NSURLConnection 过期,苹果推荐使用 NSURLSession 来替换 NSURLConnection 完成网路请求相关 ...
- 第八篇、封装NSURLSession网络请求框架
主要功能介绍: 1.GET请求操作 2.POST请求操作 1.处理params参数(例如拼接成:usename="123"&password="123" ...
- iOS - AFNetworking 网络请求
前言 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的.但是,在绝大部分下我们所需要访 ...
- iOSAFNetworking 网络请求
前言 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的.但是,在绝大部分下我们所需要访 ...
- CHNetRequest网络请求
Paste JSON as Code • quicktype 软件的使用 iOS开发:官方自带的JSON使用 JSON 数据解析 XML 数据解析 Plist 数据解析 NetRequest 网络数据 ...
- IOS网络请求之NSURLSession使用
前言: 无论是Android还是ios都离不开与服务器交互,这就必须用到网络请求,记得在2013年做iOS的时候那时候用的ASIHTTPRequest框架,现在重新捡起iOS的时候ASIHTTPReq ...
- iOS之网络请求NSURLSession剖析
2013年的WWDC大会上,苹果推出了NSURLSession,对Foundation URL加载系统进行了彻底的重构,提供了更丰富的API来处理网络请求,如:支持http2.0协议.直接把数据下载到 ...
随机推荐
- VB6 GDI+ 入门教程[7] Graphics 其他内容
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[7] Graphics 其他内容 2009 年 9 月 ...
- 如何在腾讯云上搭建一个人力资源Saas
版权声明:本文由ihr原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/180 来源:腾云阁 https://www.qclo ...
- JavaScript开发者常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- GIT命令(急速学习)
用过sourceTree,egit(eclipse中的git插件),最后还是感觉git bash顺手:svn早已经不用: 先上几个原来看过的git 教程--书读百遍,其义自见.多看几篇文章才能总结 ...
- Java基础:多线程
基本概念 程序&线程&进程 程序是一个段可以提供业务功能的代码,它可以包含1个或多个进程.程序在OS上运行时表现为进程对各种资源(CPU,内存,Disk..)的消耗和处理. 进程是OS ...
- JAVA 多态和异常处理作业——动手动脑以及课后实验性问题
1. 阅读以下代码(CatchWho.java),写出程序运行结果: 1) 源代码 public class CatchWho { public static void main(String[] ...
- hdu 1695 GCD(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- stackview
Stack View会被当成Container View.所以它是一个不会被渲染的UIView子类.它不像其他UIView子类一样,会被渲染到屏幕上.这也意味着设置其backgroundColor属性 ...
- 233. Number of Digit One *HARD* -- 从1到n的整数中数字1出现的次数
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...
- settimeout如何调用方法的时候,传递参数
常见写法: setTimeout("loaded()", 200); 延迟加载loaded方法 如果要给loaded方法传递参数 setTimeout(function () { ...