NSURLSessionDownloadTask 断点下载
#import "ViewController.h"
#import "ASIHTTPRequest.h"
#import <AFNetworking/AFNetworking.h>
@interface ViewController () <NSURLSessionDownloadDelegate>
@property (strong,
nonatomic) NSURLSessionDownloadTask *resumableTask;
// 可恢复的下载任务
@property (strong,
nonatomic) NSURLSession *currentSession;
// 当前会话
/* 用于可恢复的下载任务的数据 */
@property (strong,
nonatomic) NSData *partialData;
@property (weak,
nonatomic) IBOutlet UIProgressView *downloadingProgressView;
@property (weak,
nonatomic) IBOutlet UILabel *currentProgress_label;
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
AFHTTPRequestOperationManager *man = [AFHTTPRequestOperationManager
manager];
}
/* 创建当前的session */
- (void)createCurrentSession {
NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration
defaultSessionConfiguration];
self.currentSession = [NSURLSession
sessionWithConfiguration:defaultConfig delegate:self
delegateQueue:nil];
self.currentSession.sessionDescription =
@"fdfd";
}
- (IBAction)download:(id)sender {
if (!self.currentSession) {
[self
createCurrentSession];
}
if (self.partialData) {
// 假设是之前被暂停的任务,就从已经保存的数据恢复下载
self.resumableTask = [self.currentSession
downloadTaskWithResumeData:self.partialData];
}
else {
// 否则创建下载任务
NSString *imageURLStr =
@"http://192.168.1.102/0701.zip";
NSURLRequest *request = [NSURLRequest
requestWithURL:[NSURL
URLWithString:imageURLStr]];
self.resumableTask = [self.currentSession
downloadTaskWithRequest:request];
}
[self.resumableTask
resume];
self.partialData =
nil;
}
- (IBAction)stop:(id)sender {
[self.resumableTask
cancelByProducingResumeData:^(NSData *resumeData) {
// 假设是可恢复的下载任务,应该先将数据保存到partialData中,注意在这里不要调用cancel方法
self.partialData = resumeData;
self.resumableTask =
nil;
NSLog(@"resumeData = %@", resumeData);
[resumeData writeToFile:@"/Users/Mac/Desktop/resumeData"
atomically:YES];
}];
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
NSLog(@"location = %@", location);
// 设置文件的存放目标路径
NSString *documentsPath =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES).firstObject;
NSURL *documentsDirectoryURL = [NSURL
fileURLWithPath:documentsPath];
NSURL *fileURL = [documentsDirectoryURL
URLByAppendingPathComponent:[[downloadTask.response
URL] lastPathComponent]];
// 假设该路径下文件已经存在。就要先将其移除,在移动文件
NSFileManager *fileManager = [NSFileManager
defaultManager];
if ([fileManager fileExistsAtPath:[fileURL
path] isDirectory:NULL]) {
[fileManager removeItemAtURL:fileURL
error:NULL];
}
[fileManager moveItemAtURL:location
toURL:fileURL error:NULL];
}
/* 从fileOffset位移处恢复下载任务 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
NSLog(@"NSURLSessionDownloadDelegate: Resume download at %lld", fileOffset);
}
/* 完毕下载任务,不管下载成功还是失败都调用该方法 */
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"NSURLSessionDownloadDelegate: Complete task");
NSLog(@"下载失败:%@", error);
}
/* 运行下载任务时有数据写入 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
// 期望收到的全部data字节数
{
// 计算当前下载进度并更新视图
double downloadProgress = totalBytesWritten / (double)totalBytesExpectedToWrite;
[self setDownloadProgress:downloadProgress];
}
/* 依据下载进度更新视图 */
- (void)setDownloadProgress:(double)progress {
NSString *progressStr = [NSString
stringWithFormat:@"%.1f", progress *
100];
progressStr = [progressStr stringByAppendingString:@"%"];
NSLog(@"progressStr = %@", progressStr);
dispatch_async(dispatch_get_main_queue(), ^{
self.downloadingProgressView.progress = progress;
self.currentProgress_label.text = progressStr;
});
}
@end
[self.currentSession downloadTaskWithResumeData:self.partialData];
通过resumeData的原因例如以下是resumeData内容
resumeData内容例如以下
<?xml version="1.0" encoding="UTF-8"?
>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSURLSessionDownloadURL</key>
<string>http://192.168.1.102/0701.zip</string>
<key>NSURLSessionResumeBytesReceived</key>
<integer>47271936</integer>
<key>NSURLSessionResumeCurrentRequest</key>
<data>
YnBsaXN0MDDUAQIDBAUGcnNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
AAGGoK8QGAcIP0BGR05PUFFSU1Q1VVZiY2RlZmdobVUkbnVsbN8QGwkKCwwNDg8QERIT
FBUWFxgZGhscHR4fICEiIyQlJicoKSUrLC0nLycmJiYkNTYmOCY6Jjw9PlMkMTJSJDNT
JDI1UyQxN1IkNFMkMjFTJDEzViRjbGFzc1IkNVMkMThSJDZTJDIyUyQxNFIkN1MkMTlT
JDEwUiQ4UiQwUyQxNVMkMjNSJDlTJDExUiQxUyQyNFMkMTZSJDJTJDIwgAiAAoAAgAeA
A4AOgAKAF4AGgAyAB4APgAeAAIAAgACACBACgAqAAIAJgAAQCYAAgAsQFoANCNNBEEIm
REVXTlMuYmFzZVtOUy5yZWxhdGl2ZYAAgAWABF8QHWh0dHA6Ly8xOTIuMTY4LjEuMTAy
LzA3MDEuemlw0khJSktaJGNsYXNzbmFtZVgkY2xhc3Nlc1VOU1VSTKJMTVVOU1VSTFhO
U09iamVjdCNATgAAAAAAABAACREBhCMAAAAAAAAAACMAAAAAAAAAABP//////////1NH
RVTTV1gQWV1hV05TLmtleXNaTlMub2JqZWN0c6NaW1yAEIARgBKjXl9ggBOAFIAVgBZf
EA9BY2NlcHQtRW5jb2RpbmdWQWNjZXB0XxAPQWNjZXB0LUxhbmd1YWdlXWd6aXAsIGRl
ZmxhdGVTKi8qVWVuLXVz0khJaWpcTlNEaWN0aW9uYXJ5omtsXE5TRGljdGlvbmFyeVhO
U09iamVjdNJISW5vXE5TVVJMUmVxdWVzdKJwcVxOU1VSTFJlcXVlc3RYTlNPYmplY3Rf
EA9OU0tleWVkQXJjaGl2ZXLRdHVUcm9vdIABAAgAEQAaACMALQAyADcAUgBYAJEAlQCY
AJwAoACjAKcAqwCyALUAuQC8AMAAxADHAMsAzwDSANUA2QDdAOAA5ADnAOsA7wDyAPYA
+AD6APwA/gEAAQIBBAEGAQgBCgEMAQ4BEAESARQBFgEYARoBHAEeASABIgEkASYBKAEq
ASwBLQE0ATwBSAFKAUwBTgFuAXMBfgGHAY0BkAGWAZ8BqAGqAasBrgG3AcAByQHNAdQB
3AHnAesB7QHvAfEB9QH3AfkB+wH9Ag8CFgIoAjYCOgJAAkUCUgJVAmICawJwAn0CgAKN
ApYCqAKrArAAAAAAAAACAQAAAAAAAAB2AAAAAAAAAAAAAAAAAAACsg==
</data>
<key>NSURLSessionResumeEntityTag</key>
<string>"c04546-5c3ca3fe-5162cb9046b80"</string>
<key>NSURLSessionResumeInfoLocalPath</key>
<string>/Users/Mac/Library/Developer/CoreSimulator/Devices/E460928F-4469-41A7-B94E-8E6372A96C89/data/Containers/Data/Application/8E686354-BA1D-408E-8124-56AC07CD7287/tmp/CFNetworkDownload_brs2kY.tmp</string>
<key>NSURLSessionResumeInfoVersion</key>
<integer>1</integer>
<key>NSURLSessionResumeOriginalRequest</key>
<data>
YnBsaXN0MDDUAQIDBAUGTk9YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
AAGGoK4HCDM0OjtCQ0RFRkdISVUkbnVsbN8QFQkKCwwNDg8QERITFBUWFxgZGhscHR4f
ICEfIyQlICAoKCgeLC0uKDAxMlMkMTJSJDNTJDE3UiQ0UyQxM1YkY2xhc3NSJDVTJDE4
UiQ2UyQxNFIkN1MkMTlTJDEwUiQ4UiQwUyQxNVIkOVMkMTFSJDFTJDE2UiQygAiAAoAH
gAOAAoANgAaADIAHgAeAAIAAgACACBACgAqACYAAEAmACxAQCNM1DjYoODlXTlMuYmFz
ZVtOUy5yZWxhdGl2ZYAAgAWABF8QHWh0dHA6Ly8xOTIuMTY4LjEuMTAyLzA3MDEuemlw
0jw9Pj9aJGNsYXNzbmFtZVgkY2xhc3Nlc1VOU1VSTKJAQVVOU1VSTFhOU09iamVjdCNA
TgAAAAAAABAACREBgCMAAAAAAAAAACMAAAAAAAAAABP//////////9I8PUpLXE5TVVJM
UmVxdWVzdKJMTVxOU1VSTFJlcXVlc3RYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLR
UFFUcm9vdIABAAgAEQAaACMALQAyADcARgBMAHkAfQCAAIQAhwCLAJIAlQCZAJwAoACj
AKcAqwCuALEAtQC4ALwAvwDDAMYAyADKAMwAzgDQANIA1ADWANgA2gDcAN4A4ADiAOQA
5gDoAOoA7ADuAPAA8QD4AQABDAEOARABEgEyATcBQgFLAVEBVAFaAWMBbAFuAW8BcgF7
AYQBjQGSAZ8BogGvAbgBygHNAdIAAAAAAAACAQAAAAAAAABSAAAAAAAAAAAAAAAAAAAB
1A==
</data>
<key>NSURLSessionResumeServerDownloadDate</key>
<string>Sat, 16 May 2015 06:03:42 GMT</string>
</dict>
</plist>
版权声明:本文博主原创文章,博客,未经同意不得转载。
NSURLSessionDownloadTask 断点下载的更多相关文章
- iOS 大文件断点下载
iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目 •2. 或使用Cocopod 导入AFNetworking3.0+ •3. ...
- iOS开发-大文件下载与断点下载思路
大文件下载方案一:利用NSURLConnection和它的代理方法,及NSFileHandle(iOS9后不建议使用)相关变量: @property (nonatomic,strong) NSFile ...
- iOS- 利用AFNetworking(AFN) - 实现文件断点下载
https://www.cnblogs.com/qingche/p/3500746.html 1. 定义一个全局的AFHttpClient:包含有 1> baseURL 2> 请求 3&g ...
- Java实现多线程断点下载(下载过程中可以暂停)
线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...
- 安卓(android)之实现断点下载功能
一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- IOS 断点下载
// // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...
随机推荐
- 成都OpenPart——DevOps专场活动参与感
今天下午去参加了成都OpenPart——DevOps专场,感觉很好. 题外话: 回想一下,工作将近四年了,这是第一次参加类似的活动.自从结婚带了小孩以后,就基本上每个周末奔波工作和家里两个城市之间,这 ...
- 《无懈可击的Web设计》_灵活的文字
常见的方法 body{ font-size:12px; } 使用像素单位的优点: 不管使用哪种浏览器或者设备来查看,文字看起来都大小一致. 为什么这么做不是无懈可击的? 以像素为单位设定文字大小之后, ...
- BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
Description FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:).在赛场上,奶牛们按1..N依次编号.每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平 ...
- 使用 Cloud Insight SDK 监控北京空气质量!
现在越来越多的 App 都开始有广告了.特别是空气质量监测,和天气类的 App,广告还是蛮多的,眼花缭乱,真是够了. 最近刚好在用一款系统监控工具 Cloud Insight,它提供的 SDK 可以把 ...
- Desert King
poj2728:http://poj.org/problem?id=2728 题意:给你n的点,每一个点会有一个坐标(x,y),然后还有一个z值,现在上你求一棵生成树,是的这棵生成树的所有边的费用/所 ...
- IE连EXCHANGE的HTTPS时,出现错误
"There is a problem with this website's security certificate" 这种问题,一般是SSL或CA认证证书的问题. 一般从服务 ...
- 移动周报:十款最实用的Android UI设计工具
上一周可以说是一个不断Mark周,从最实用的Android UI设计工具.免费移动应用测试框架推荐,到HTML5开发框架等等,各种开发工具.框架精彩丰呈,看得小伙伴们是不亦乐乎.当然,还有不容错过的M ...
- [wikioi]回家
http://wikioi.com/problem/1079/ 单源最短路径,可以用dijkstra来做.这里采用了heap优化,复杂度是(V+E)logV.这里用了STL的优先队列(堆),重复加入p ...
- linux使用ps1设置命令行提示符
要自定义命令行提示,需要ps1来设置.完成自定义需要以下几个步骤: 1.编辑~/.bashrc文件 vi ~/.bashrc 2.在.bashrc文件中添加以下一行自定义内容 export PS1=& ...
- MySQL源码之两阶段提交
在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version配置: sync_binlog=1 innodb_flush_log_at_trx_comm ...