一转眼秋天都到了,外面下着雨,叶子也开始落了。
好了,说正题,学习已经九周了,一天一天的积累,学到的东西也蛮多的,学如逆水行舟,所以,只要坚持每天都前进一点,过一段时间就会发现自己已经学了很多东西,前进了很长一段路。而且技术没有捷径,孰熟能生巧,练习的多了就会懂得其中的奥妙。
前天学了网络下载的断点与续传,值得分享。
#import "ViewController.h"
@interface ViewController ()<NSURLConnectionDataDelegate>
{
BOOL isDownLoad;//标记是否正在下载
NSMutableData *receiveData;//接收到的数据
double total;//要下载数据的总大小
double recevieTotal;//已经接收到的数据的大小
NSString *_filePath;//文件写入的路径
NSURLConnection *_connection;//网络请求的对象
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"%@---沙盒",NSHomeDirectory());
//
//--取得下载数据的大小
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//(注:NSUserDefaults是单例)
recevieTotal = [[userDefaults objectForKey:@"RecevieTotal"]doubleValue];
total = [[userDefaults objectForKey:@"Total"]doubleValue];
//显示上一次下载的进度
if (total > 0) {
CGFloat progress = recevieTotal / total;
// NSLog(@"jindu====%.3f",progress);
self.progress.progress = progress;
self.label.text = [NSString stringWithFormat:@"%.2f%%",progress * 100];
}
}
#pragma mark -暂停
- (IBAction)stopClick:(UIButton *)sender {
//断点--
//--取消下载连接
if (isDownLoad == YES) {
[_connection cancel];
_connection = nil;
//--将缓冲数据写入文件
[self writeToFile:receiveData];
//-本地保存下载文件的大小和总文件大小
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@(recevieTotal) forKey:@"RecevieTotal"];
[userDefaults setObject:@(total) forKey:@"Total"];
//将数据同步写入文件
[userDefaults synchronize];
isDownLoad = NO;
[self.btn setTitle:@"点击下载" forState:UIControlStateNormal];
}
}
#pragma mark -开始下载
- (IBAction)asynRequst:(id)sender {
if (!isDownLoad) {
[sender setTitle:@"正在下载" forState:UIControlStateNormal];
//1.
NSURL *url = [NSURL URLWithString:@"http://free2.macx.cn:8182/tools/play/qqmusic30b5.dmg"];
//2.构建request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//*****设置断点续传
if (recevieTotal > 0) {
//设置继续下载的位置
NSString *value = [NSString stringWithFormat:@"bytes=%d-",(int)recevieTotal];
[request setValue:value forHTTPHeaderField:@"Range"];
}
//
//3.发送异步请求
_connection = [NSURLConnection connectionWithRequest:request delegate:self];
isDownLoad = YES;
//获取字符串
NSString *urlString = url.absoluteString;
//获取urlString的最后一部分
NSString *fileName = [urlString lastPathComponent];
//写入文件
_filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];
//***判断文件是否存在,如果不存在,则创建
if (![[NSFileManager defaultManager]fileExistsAtPath:_filePath]) {
//-创建文件
[[NSFileManager defaultManager]createFileAtPath:_filePath contents:nil attributes:nil];
}
}
}
#pragma mark -收到响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
{
receiveData = [[NSMutableData alloc]init];
//*****判断总大小是否为0,如果为0,则表示是从起始位置开始下载,需要获取文件的总大小
if (total == 0) {
//获取所有的响应头
NSDictionary *fileds = response.allHeaderFields;
//获取数据的总大小
NSNumber *length = [fileds objectForKey:@"Content-Length"];
total = [length doubleValue];
}
//
// //获取所有的响应头
// NSDictionary *fields = response.allHeaderFields;
//
// //获取数据的总长度
// NSNumber *length = [fields objectForKey:@"Content-Length"];
//
// total = [length doubleValue];
//// NSLog(@"%.2f---total",total/1000 / 1000);
}
#pragma mark -接受到数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
recevieTotal += data.length;
double progress = recevieTotal / total;
self.progress.progress = progress;
self.label.text = [NSString stringWithFormat:@"%.2f%%",progress * 100];
[receiveData appendData:data];
if (receiveData.length > 200 * 1000) {
[self writeToFile:receiveData];
[receiveData setData:nil];
}
}
#pragma mark -数据接受完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// NSURL *url = [connection currentRequest].URL;
//
// //获取字符串
// NSString *urlString = url.absoluteString;
//
// //获取urlString的最后一部分
// NSString *fileName = [urlString lastPathComponent];
// //写入文件
// NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];
//
// [receiveData writeToFile:filePath atomically:1];
if (receiveData.length <= 200 * 1000) {
[self writeToFile:receiveData];
[receiveData setData:nil];
}
isDownLoad = NO;
[self.btn setTitle:@"点击下载" forState:UIControlStateNormal];
}
#pragma mark -写入数据
- (void)writeToFile:(NSData *)data
{
if (data.length == 0) {
return;
}
NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:_filePath];
[handle seekToEndOfFile];
[handle writeData:data];
[handle closeFile];
}