iOS-大文件下载、断点续传实现

请求头Range

实现断点续传要了解HTTP请求头Range,通过设置Range可以指定每次从网络下载数据包的大小
Range大小设置

bytes=0-499 ,从0到499的头500个字节
bytes=500-999,从500到999的第二个500字节
bytes=500- ,从500字节以后的所有字节
bytes=-500, 最后500个字节
bytes=500-599,800-899 同时指定几个范围

用原生API请求
NSURL *url = [NSURL URLWithString:@""];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.currentLength];
[request setValue:range forHTTPHeaderFiled:@"Range"];
实现方式

(1)NSURLConnection
(2)NSURLSession(iOS7 新出)

NSURLSession有三种任务类型:
NSURLSessionDataTask : 普通的GET\POST请求
NSURLSessionDownloadTask : 文件下载
NSURLSessionUploadTask : 文件上传

注意
NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

    }];

location就是下载好的文件写入沙盒的地址(iOS沙盒文件夹(Documents,Library,tmp))
下载完成之后会自动删除temp中的文件,开发者需要在回调中把文件移动或者复制到指定目录下
缺点就是无法监听下载进度
要监听下载进度,NSURLSessionDownloadDelegate

NSURLSessionDownloadDelegate的三个方法

功能:遵守NSURLSessionDownloadDelegate可以监听下载的进度值
(1)didFinishDownloadingToURL 下载完毕会调用
(2)didWriteData:totalBytesWritten:totalBytesExpectedToWrite: (这次写入的大小:已经写入沙盒的大小:文件总大小)
(3)didResumeAtOffset:expectedTotalBytes (恢复下载后调用)

恢复下载api

downloadTaskWithResumeData: (恢复下载)

开发遇到问题:

接收文件的NSMutableData一直内存,随着文件的下载一直变大.

解决:

NSFileHandle,对文件读取,写入,更新.
移动到文件的最后面: seekToEndFile
将数据写入沙盒: writeData
累计写入文件的长度: self.currentLength += data.length
加载完毕调用: closeFile

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值