本文转载至 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实现程序重新启动时的断点续传相关推荐

  1. python程序退出后保存变量_Python将变量存储在一个列表中,每次程序重新启动时都会保存这些变量...

    我正为我的频道开发一个Python Twitch IRC Bot,它似乎很简单,但我却被困在一个看似简单的任务上.我有一个积分系统,我认为它是有效的,但我发现每次我重新启动程序,包含用户余额的列表都会 ...

  2. 程序启动时,vc2015设置哪个窗体先打开,优先启动,设置方法

    程序启动时,vc2015设置哪个窗体先打开,设置方法 工程名对应的APP文件中 InitInstance中 //Caccess_mdb_operationDlg dlg;  //可以设置这里,首先启动 ...

  3. Mac显示“您的系统已耗尽应用程序内存”时,怎么办?

    MacOS基于Unix,这意味着其内存管理非常强大.但是,它并不完美,因此您可能仍然会看到一条错误消息,告诉您"您的系统已耗尽应用程序内存." 这是什么意思,为什么会发生?我们将解 ...

  4. java程序重启_如何使您的Java应用程序重新启动

    参见英文答案 > How can I restart a Java application?????????????????????????????????????13个 我想在我的应用程序中实 ...

  5. linux c 启动程序吗,Linux下C程序启动时的系统调用

    写程序跟踪发现,在Linux i386中,一个程序体完全为空的C语言程序启动时要进行近100个系统调用,如下所示. [ 1]syscall: 11 //execve [ 2]syscall: 45 / ...

  6. Linux系统程序运行时加载动态库路径顺序

    程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...

  7. java 程序运行时注入方法_Spring入门(九):运行时值注入

    Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Spring表达式语言(SpEL) 1. 属性占位符 1.1 注入外部的值 1.1.1 使用Envi ...

  8. kafka重新启动时出现:found a corrupted index file due to requirement failed问题解决方法

    kafka重新启动时出现:found a corrupted index file due to requirement failed问题解决方法 参考文章: (1)kafka重新启动时出现:foun ...

  9. VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)

    VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) 参考文章: (1)VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) (2)https://www.cnblogs.com/ ...

  10. error C2057: expected constant expression (C语言中数组的大小可以在程序运行时定义吗? )

    数组的大小可以在程序运行时定义吗? 不.在数组的定义中,数组的大小必须是编译时可知的,不能是在程序运行时才可知的.例如,假设i是一个变量,你就不能用i去定义一个数组的大小: char array[i] ...

最新文章

  1. 自动驾驶真的会来得那么快吗:关于自动驾驶的7个疑问
  2. CentOS虚拟机克隆后网卡配置问题
  3. ExtJs Ext.TaskMgr定时刷新数据源
  4. 中raise抛出异常_Python 异常处理知识点汇总,五分钟就能学会 !
  5. java获得指定的开始时间与结束时间之间的所有日期
  6. [CB]加快BCB编译速度
  7. Linux 下的Core Dump
  8. 如何在 Linux 上重命名一组文件
  9. 高级语言程序设计II 实验报告三c++使用文本文件和二进制文件的读写比较两者的区别和优劣...
  10. 好奇怪呀后面加什么标点_好奇怪,为什么开发商就不能把这款好户型打造得更完美些呢?...
  11. Java并发编程的艺术下载
  12. 计算机考试专业知识题库,计算机考试题库:计算机考试练习题(113)
  13. javaw.exe与java.exe_java.exe和javaw.exe的区别及使用方法
  14. 玉蟾宫【洛谷P4147】
  15. L1-079 天梯赛的善良
  16. python机器人开发——基于Micropython的智能机器人底层控制开发
  17. 如何设计网页?快速制作网页秘诀!
  18. Note For Linux By Jes(14)-启动流程、模块管理与 Loader
  19. JavaScript高级笔记_002_构造函数和原型
  20. HDU2795 Billboard 线段树

热门文章

  1. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端战五渣学JavaScript——Promise...
  2. 现代通信原理2.1:谈谈信号
  3. Spring Cloud学习笔记---Spring Cloud Sleuth--一个手动搭建zipkin碰到的坑
  4. 想去机器学习初创公司做数据科学家?这些问题值得你三思!
  5. 解决vscode中Linter pylint is not installed的问题
  6. Raki的读paper小记:An Effective Transition-based Model for Discontinuous NER
  7. ucla计算机科学和数学专业,UCLA的CS「加州大学洛杉矶分校计算机科学系」
  8. 外网接口(浏览器接口)调取设备数据,放到数据库里
  9. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
  10. Delphi第三方控件安装卸载指南