您的位置:首页 > 移动开发 > IOS开发

AF断点下载和计算下载速度

2017-01-10 15:11 246 查看
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS