AFHTTPRequestOperation *operation;//成员变量
- (void)startDownload {
DownTask *downTask = [[DownTask alloc]init];
downTask.date = [NSDate date];
NSString *strURL = [self.dic[@"url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *downloadUrl = FORMAT(@"%@%@",url_down,strURL);
NSArray * arr = [self.dic[@"url"] componentsSeparatedByString:@"/"];
NSString * str = [arr objectAtIndex:(arr.count - 1)];
[MagicBeanDefaults setMapFileName:str];
NSString *downloadPath = [[[CacheManager sharedManager]getCacheUrl] stringByAppendingPathComponent:str];
request = [NSURLRequest requestWithURL:[NSURL URLWithString:downloadUrl]];
//检查文件是否已经下载了一部分
unsigned long long downloadedBytes = 0;
if ([[NSFileManager defaultManager] fileExistsAtPath:downloadPath]) {
//获取已下载的文件长度
downloadedBytes = [self fileSizeForPath:downloadPath];
if (downloadedBytes > 0) {
NSMutableURLRequest *mutableURLRequest = [request mutableCopy];
NSString *requestRange = FORMAT(@"bytes=%llu-", downloadedBytes);
[mutableURLRequest setValue:requestRange forHTTPHeaderField:@"Range"];
request = mutableURLRequest;
}
}
operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:downloadPath append:YES];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
float progress = (float)(totalBytesRead + downloadedBytes) / (totalBytesExpectedToRead + downloadedBytes);
unsigned long long downloaded = [self fileSizeForPath:downloadPath]/1024/1024;
NSString *downStr = FORMAT(@"%llu",downloaded);
//计算一秒中的速度
downTask.totalRead += bytesRead;
//获取当前时间
NSDate *currentDate = [NSDate date];
//当前时间和上一秒时间做对比,大于等于一秒就去计算
if ([currentDate timeIntervalSinceDate:downTask.date] >= 1) {
//时间差
double time = [currentDate timeIntervalSinceDate:downTask.date];
if(downTask.totalRead == 0)
{
downTask.speed = @"0KB/s";
}else
{
long long speed = downTask.totalRead/time;
downTask.speed = [downTask formatByteCount:speed];
}
//维护变量,将计算过的清零
downTask.totalRead = 0.0;
//维护变量,记录这次计算的时间
downTask.date = currentDate;
}
NSLog(@"%f------%@Mb",progress,downStr);
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:FORMAT(@"%f",progress),@"progress",downStr,@"downloaded",downTask.speed,@"speed", nil];
[[NSNotificationCenter defaultCenter]postNotificationName:@"MAPDownloadProgress" object:dic];
}];
//成功和失败回调
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[btn setTitle:NSLocalizedString(@"SyncNOw", nil) forState:UIControlStateNormal];
_isDownloading = NO;
[MagicBeanDefaults setMapDown:YES];
NSString *md5Str = [MD5 getFileMD5WithPath:FORMAT(@"%@/%@",[[CacheManager sharedManager]getCacheUrl],str)];
if ([md5Str isEqualToString:self.dic[@"md5"]]) {
}else{
[[NSFileManager defaultManager] removeItemAtPath:FORMAT(@"%@/%@",[[CacheManager sharedManager]getCacheUrl],[MagicBeanDefaults getMapFileName]) error:nil];
[MagicBeanDefaults setMapDown:NO];
[MagicBeanDefaults setMapFileName:nil];
// [MagicBeanDefaults setMapDownInfo:nil];
[UIView markToast:@"下载文件出错,请重新下载。"];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[UIView markToast:NSLocalizedString(@"DownloadFailed", nil)];
_isDownloading = NO;
}];
[operation start];
}
//用于计算文件下载速度
#import <Foundation/Foundation.h>
@interface DownTask : NSObject
@property (nonatomic,assign) NSUInteger totalRead;
@property (nonatomic,strong)NSDate *date;
@property (nonatomic,strong)NSString * speed;
- (NSString*)formatByteCount:(long long)size;
@end
#import "DownTask.h"
@implementation DownTask
- (NSString *)formatByteCount:(long long)size
{
return [NSByteCountFormatter stringFromByteCount:size countStyle:NSByteCountFormatterCountStyleFile];
}
@end
//用于计算文件的md5值和服务器对比
+(NSString*)getFileMD5WithPath:(NSString*)path
{
return (__bridge_transfer NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
}