AF断点下载和计算下载速度
2017-01-10 15:11
288 查看
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);
}
- (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);
}
相关文章推荐
- iOS开发下载文件速度计算(刚刚)
- asp.net实现的计算网页下载速度的代码
- Android 基于OkHttp的下载,支持https,断点下载,优化下载速度
- 实时下载速度的计算:
- 如何计算下载速度
- android下载, 断点续传, 在关闭activity或杀进程后,可继续下载,保证android下载速度
- 宽带网的下载速度计算
- AF大文件断点下载
- 安卓计算下载速度
- MFC 的几个常用函数,用来计算文件大小,下载速度,转换时间的
- iOS计算网络测试中的丢包率,延迟,下载速度等参数、iOS实现ping
- MFC 的几个常用函数,用来计算文件大小,下载速度,转换时间的
- Android下载速度计算
- MFC 的几个常用函数,用来计算文件大小,下载速度,转换时间的
- 计算件的大小和获取下载速度
- Google纯文字广告将"网页下载速度"列入计算因素
- iOS开发下载文件速度计算
- 如何计算下载速度
- 下载速度计算/带宽计算/带宽是什么意思?
- iOS开发下载文件速度计算