(一二七)NSURLSession的基本用法 下载与数据获取
简介
NSURLSession是苹果官方提供的一系列网络接口库,使用他们可以轻松实现下载和数据获取等任务。在上一篇文章中,我们介绍了使用NSURLConnection下载文件和断点续传的功能,实现起来比较麻烦,对于文件的操作也比较繁琐,如果使用NSURLSession,这一切都将变得极为容易。
用法
数据请求
1.获取URLSession单例对象,并利用该对象创建一个dataTask,使用结构体回调。
这段代码从网站上抓取JSON数组,解析为OC字典。NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"http://www.soulghost.com/randompk/storeTest/baseRandom.php?type=attack"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"%@",dict);
}];2.开启任务
所有任务在创建时都是暂停的,应该手动启动。[task resume];小文件下载
1.获取URLSession单例对象,创建一个downloadTask。- 注意此任务默认将文件下载到tmp文件夹,并且在下载结束后如果不处理会秒删,一般的做法是把它移动到Document或者Caches中,当下载结束后会调用结构体,在结构体里处理文件即可。
通过NSFileManager可以实现文件的复制、移动操作,回调的location是tmp中刚刚下载的文件的URL。
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://127.0.0.1/lesson1/nav.dmg"] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// 临时下载到tmp,必须及时处理,否则会被系统秒删。
// 应该将临时文件移动到Caches文件夹
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 可以使用建议的文件名,与服务端一致
NSString *file = [path stringByAppendingPathComponent:response.suggestedFilename];
// 移动文件
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr moveItemAtPath:location.path toPath:file error:nil];
}];2.开启任务
所有任务在创建时都是暂停的,应该手动启动。[task resume];
大文件下载
大文件常常需要获取进度,这就需要设置代理,而不是用block回调。
1.遵循代理方法,创建两个成员,一个用于指向下载任务对象,另一个用于保存断点数据。@interface ViewController () <NSURLSessionDownloadDelegate>
@property (nonatomic, strong) NSURLSessionDownloadTask *task;
@property (nonatomic, strong) NSData *resumeData;
@end2.获取URLSession单例,创建下载任务,注意使用的方法与前面不同。
- 不要忘了保存task。
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://127.0.0.1/lesson1/nav.dmg"] ];
[task resume];
_task = task;3.下载过程中会调用下面的代理方法,指示此次下载的字节数,一共下载的字节数与总字节数。
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
NSLog(@"写入量:%lld 下载进度:%f",bytesWritten,(double)totalBytesWritten/totalBytesExpectedToWrite);
}4.下载结束后回调用下面的代理方法,从中同样要移动文件,只是如果要想拿到响应体response的suggestedFilename,需要通过downloadTask。
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 可以使用建议的文件名,与服务端一致
NSString *file = [path stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
// 移动文件
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr moveItemAtPath:location.path toPath:file error:nil]; [self.btn setTitle:@"Start" forState:UIControlStateNormal];
}5.如果要暂停下载,调用下面的方法,通过回调结构体拿到断点数据,保存在我们之前创建的成员中以便恢复。
- 注意用weakSelf避免循环引用。
- 任务结束后就无效了,应该让指针指向nil来释放内存。
__weak typeof(self) weakSelf = self;
[self.task cancelByProducingResumeData:^(NSData *resumeData) {
// resumeData内部包含了下次继续下载的开始位置
weakSelf.resumeData = resumeData;
weakSelf.task = nil;
}];6.要恢复下载数据很容易,只需要通过断点创建任务即可。
- 注意清空resumeData。
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 传入上次暂停下载返回的数据
NSURLSessionDownloadTask *task = [session downloadTaskWithResumeData:self.resumeData];
[task resume];
_task = task;
_resumeData = nil;断点续传开始时会调用下面的代理方法说明文件信息。
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
}
(一二七)NSURLSession的基本用法 下载与数据获取的更多相关文章
- iOS7 中的新加入的下载类NSURLSession(随ios版本更新而更新)
想详细的了解网络下载的相关知识,要仔细阅读URL Loading System Programming Guide 这里有篇好文章(http://www.shinobicontrols.com/blo ...
- IOS-网络(NSURLSession)
一.NSURLSession的基本用法 // // ViewController.m // NSURLSession // // Created by ma c on 16/2/1. // Copyr ...
- 基于iOS 10、realm封装的下载器
代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...
- 2016 - 1 - 24 NSURLSession (一)
一: NSURLSession简介 1.实施步骤 1.1 使用 NSURLSession对象 创建TASK ,然后执行TASK 2.TASK的类型: 二: NSURLSession的简单使用: - ( ...
- NSURLSession学习笔记
NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...
- NSURLSession的使用
虽然在iOS7引入NSURLSession时,就知道NSURLConnection会最终被苹果放弃,但人总是喜欢做熟悉的事情,在NSURLConnection还可以使用时,就懒得学习这新玩意了,而且本 ...
- 使用bitsadmin.exe 下载文件,配合bcn.bat玩出更多的花样~~
bitsadmin的简单介绍与基本用法: bitsadmin.exe 可以用来在windows 命令行下下载文件.bitsadmin是windows 后台智能传输服务的一个工具,windows 的自动 ...
- NSURLSession学习笔记(三)Download Task
NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务. 我们直接从分析Demo入手: 故事板如下: 只有一个View Controll ...
- iOS学习笔记13-网络(二)NSURLSession
在2013年WWDC上苹果揭开了NSURLSession的面纱,将它作为NSURLConnection的继任者.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用 ...
随机推荐
- POJ 2289(多重匹配+二分)
POJ 2289(多重匹配+二分) 把n个人,分到m个组中.题目给出每一个人可以被分到的那些组.要求分配完毕后,最大的那一个组的人数最小. 用二分查找来枚举. #include<iostream ...
- ●BZOJ 3672 [Noi2014]购票
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3672 题解: 斜率优化DP,点分治(树上CDQ分治...) 这里有一个没有距离限制的简单版: ...
- poj 2318 叉积+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13262 Accepted: 6412 Description ...
- [bzoj省选十连测推广赛2]T2七彩树
抄自:http://blog.csdn.net/coldef/article/details/61412577 当时看了就不会,看了别人的题解不懂怎么维护,最后抄了个代码....... 给定一棵n个点 ...
- 音频自动增益 与 静音检测 算法 附完整C代码
前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...
- glusterfs 4.0.1 rpc 分析笔记2 (socket.so 模块)
socket.c在4000行位置定义了一组结构函数,我们可以从这里开始找到入口,如果是客户端则需要调用connect, 如果是服务端则需要调用listen, struct rpc_transport_ ...
- 【转】Java方向如何准备技术面试答案(汇总版)
本文转载自:“Java团长”公众号 1.面向对象和面向过程的区别 面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采 ...
- ServiceStack 简单服务搭建
1:定义数据实体 因为ServiceStack是基于请求参数来定义请求路由的,所以关键的是请求参数一定要定义好,同时可以在请求参数上自定义路由名和请求方式,作为对外接口名 上代码: namespace ...
- day05 Servlet 开发和 ServletConfig 与 ServletContext 对象
day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...
- Luogu P1257 平面上的最接近点对_暴力
这道题数据不大 两点距离用勾股定理求 #include<iostream> #include<cmath> using namespace std; struct node{ ...