AFNetworking实现程序重新启动时的断点续传
本文转载至 http://www.it165.net/pro/html/201403/10755.html
今天需要用AFNetworking实现断点续传的功能,但是在进行了一番研究之后,发现AFNetworking虽然支持下载文件的暂停和继续,但是程序重新启动后再次下载无法进行续传。网上有说可以通过AFDownloadRequestOperation这个AFNetworking的扩展库来实现重新启动后的续传,但是经过本人测试,这个库在最新的AFNetworking上会报错,无奈之下,参考他的代码,自己实现了一个,在这里分享给大家。
实现的代码如下:
view sourceprint?01.
//获取已下载的文件大小
02.
- (unsigned
long
long
)fileSizeForPath:(NSString *)path {
03.
signed
long
long
fileSize =
0
;
04.
NSFileManager *fileManager = [NSFileManager
new
];
// default is not thread safe
05.
if
([fileManager fileExistsAtPath:path]) {
06.
NSError *error = nil;
07.
NSDictionary *fileDict = [fileManager attributesOfItemAtPath:path error:&error];
08.
if
(!error && fileDict) {
09.
fileSize = [fileDict fileSize];
10.
}
11.
}
12.
return
fileSize;
13.
}
14.
//开始下载
15.
- (
void
)startDownload {
16.
NSString *downloadUrl = @
"http://www.xxx.com/xxx.zip"
;
17.
NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:
0
];
18.
NSString *downloadPath = [cacheDirectory stringByAppendingPathComponent:@
"xxx.zip"
];
19.
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:downloadUrl]];
20.
//检查文件是否已经下载了一部分
21.
unsigned
long
long
downloadedBytes =
0
;
22.
if
([[NSFileManager defaultManager] fileExistsAtPath:downloadPath]) {
23.
//获取已下载的文件长度
24.
downloadedBytes = [self fileSizeForPath:downloadPath];
25.
if
(downloadedBytes >
0
) {
26.
NSMutableURLRequest *mutableURLRequest = [request mutableCopy];
27.
NSString *requestRange = [NSString stringWithFormat:@
"bytes=%llu-"
, downloadedBytes];
28.
[mutableURLRequest setValue:requestRange forHTTPHeaderField:@
"Range"
];
29.
request = mutableURLRequest;
30.
}
31.
}
32.
//不使用缓存,避免断点续传出现问题
33.
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
34.
//下载请求
35.
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
36.
//下载路径
37.
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:downloadPath append:YES];
38.
//下载进度回调
39.
[operation setDownloadProgressBlock:^(NSUInteger bytesRead,
long
long
totalBytesRead,
long
long
totalBytesExpectedToRead) {
40.
//下载进度
41.
float
progress = ((
float
)totalBytesRead + downloadedBytes) / (totalBytesExpectedToRead + downloadedBytes);
42.
}];
43.
//成功和失败回调
44.
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
45.
46.
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
47.
48.
}];
49.
[operation start];
50.
}
需要注意的是,此种写法仅适用于下载zip包,因为下载其他格式的文件有可能出现数据过多的情况。当文件已经下载完成时,再次调用该函数,无法判断文件是否已经下载完整,于是会再次下载,此时服务器会报416错,同时返回也会输出到文件中,使得文件大小异常。但是zip格式不受影响。
AFNetworking实现程序重新启动时的断点续传相关推荐
- python程序退出后保存变量_Python将变量存储在一个列表中,每次程序重新启动时都会保存这些变量...
我正为我的频道开发一个Python Twitch IRC Bot,它似乎很简单,但我却被困在一个看似简单的任务上.我有一个积分系统,我认为它是有效的,但我发现每次我重新启动程序,包含用户余额的列表都会 ...
- 程序启动时,vc2015设置哪个窗体先打开,优先启动,设置方法
程序启动时,vc2015设置哪个窗体先打开,设置方法 工程名对应的APP文件中 InitInstance中 //Caccess_mdb_operationDlg dlg; //可以设置这里,首先启动 ...
- Mac显示“您的系统已耗尽应用程序内存”时,怎么办?
MacOS基于Unix,这意味着其内存管理非常强大.但是,它并不完美,因此您可能仍然会看到一条错误消息,告诉您"您的系统已耗尽应用程序内存." 这是什么意思,为什么会发生?我们将解 ...
- java程序重启_如何使您的Java应用程序重新启动
参见英文答案 > How can I restart a Java application?????????????????????????????????????13个 我想在我的应用程序中实 ...
- linux c 启动程序吗,Linux下C程序启动时的系统调用
写程序跟踪发现,在Linux i386中,一个程序体完全为空的C语言程序启动时要进行近100个系统调用,如下所示. [ 1]syscall: 11 //execve [ 2]syscall: 45 / ...
- Linux系统程序运行时加载动态库路径顺序
程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...
- java 程序运行时注入方法_Spring入门(九):运行时值注入
Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Spring表达式语言(SpEL) 1. 属性占位符 1.1 注入外部的值 1.1.1 使用Envi ...
- kafka重新启动时出现:found a corrupted index file due to requirement failed问题解决方法
kafka重新启动时出现:found a corrupted index file due to requirement failed问题解决方法 参考文章: (1)kafka重新启动时出现:foun ...
- VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)
VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) 参考文章: (1)VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) (2)https://www.cnblogs.com/ ...
- error C2057: expected constant expression (C语言中数组的大小可以在程序运行时定义吗? )
数组的大小可以在程序运行时定义吗? 不.在数组的定义中,数组的大小必须是编译时可知的,不能是在程序运行时才可知的.例如,假设i是一个变量,你就不能用i去定义一个数组的大小: char array[i] ...
最新文章
- 自动驾驶真的会来得那么快吗:关于自动驾驶的7个疑问
- CentOS虚拟机克隆后网卡配置问题
- ExtJs Ext.TaskMgr定时刷新数据源
- 中raise抛出异常_Python 异常处理知识点汇总,五分钟就能学会 !
- java获得指定的开始时间与结束时间之间的所有日期
- [CB]加快BCB编译速度
- Linux 下的Core Dump
- 如何在 Linux 上重命名一组文件
- 高级语言程序设计II 实验报告三c++使用文本文件和二进制文件的读写比较两者的区别和优劣...
- 好奇怪呀后面加什么标点_好奇怪,为什么开发商就不能把这款好户型打造得更完美些呢?...
- Java并发编程的艺术下载
- 计算机考试专业知识题库,计算机考试题库:计算机考试练习题(113)
- javaw.exe与java.exe_java.exe和javaw.exe的区别及使用方法
- 玉蟾宫【洛谷P4147】
- L1-079 天梯赛的善良
- python机器人开发——基于Micropython的智能机器人底层控制开发
- 如何设计网页?快速制作网页秘诀!
- Note For Linux By Jes(14)-启动流程、模块管理与 Loader
- JavaScript高级笔记_002_构造函数和原型
- HDU2795 Billboard 线段树
热门文章
- 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端战五渣学JavaScript——Promise...
- 现代通信原理2.1:谈谈信号
- Spring Cloud学习笔记---Spring Cloud Sleuth--一个手动搭建zipkin碰到的坑
- 想去机器学习初创公司做数据科学家?这些问题值得你三思!
- 解决vscode中Linter pylint is not installed的问题
- Raki的读paper小记:An Effective Transition-based Model for Discontinuous NER
- ucla计算机科学和数学专业,UCLA的CS「加州大学洛杉矶分校计算机科学系」
- 外网接口(浏览器接口)调取设备数据,放到数据库里
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
- Delphi第三方控件安装卸载指南