单军华
2018-07-11 7b02207537d35bfa1714bf8beafc921f717d100a
screendisplay/Pods/ZFDownload/ZFDownload/ZFDownloadManager.m
New file
@@ -0,0 +1,706 @@
//  ZFDownloadManager.m
//
// Copyright (c) 2016年 任子丰 ( http://github.com/renzifeng )
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "ZFDownloadManager.h"
static ZFDownloadManager *sharedDownloadManager = nil;
@interface ZFDownloadManager ()
/** 本地临时文件夹文件的个数 */
@property (nonatomic,assign ) NSInteger      count;
/** 已下载完成的文件列表(文件对象)*/
@property (atomic,strong ) NSMutableArray *finishedlist;
/** 正在下载的文件列表(ASIHttpRequest对象)*/
@property (atomic,strong ) NSMutableArray *downinglist;
/** 未下载完成的临时文件数组(文件对象)*/
@property (atomic,strong ) NSMutableArray *filelist;
/** 下载文件的模型 */
@property (nonatomic,strong ) ZFFileModel      *fileInfo;
@end
@implementation ZFDownloadManager
#pragma mark - init methods
+ (ZFDownloadManager *)sharedDownloadManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedDownloadManager = [[self alloc] init];
    });
    return sharedDownloadManager;
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        NSString * max = [userDefaults valueForKey:kMaxRequestCount];
        if (max == nil) {
            [userDefaults setObject:@"3" forKey:kMaxRequestCount];
            max = @"3";
        }
        [userDefaults synchronize];
        _maxCount = [max integerValue];
        _filelist = [[NSMutableArray alloc]init];
        _downinglist = [[NSMutableArray alloc] init];
        _finishedlist = [[NSMutableArray alloc] init];
        _count = 0;
        [self loadFinishedfiles];
        [self loadTempfiles];
    }
    return self;
}
- (void)cleanLastInfo
{
    for (ZFHttpRequest *request in _downinglist) {
        if([request isExecuting])
            [request cancel];
    }
    [self saveFinishedFile];
    [_downinglist removeAllObjects];
    [_finishedlist removeAllObjects];
    [_filelist removeAllObjects];
}
#pragma mark - 创建一个下载任务
- (void)downFileUrl:(NSString *)url
           filename:(NSString *)name
          fileimage:(UIImage *)image
{
    // 因为是重新下载,则说明肯定该文件已经被下载完,或者有临时文件正在留着,所以检查一下这两个地方,存在则删除掉
    _fileInfo = [[ZFFileModel alloc] init];
    if (!name) { name = [url lastPathComponent]; }
    _fileInfo.fileName = name;
    _fileInfo.fileURL  = url;
    NSDate *myDate = [NSDate date];
    _fileInfo.time = [ZFCommonHelper dateToString:myDate];
    _fileInfo.fileType = [name pathExtension];
    _fileInfo.fileimage = image;
    _fileInfo.downloadState = ZFDownloading;
    _fileInfo.error = NO;
    _fileInfo.tempPath = TEMP_PATH(name);
    if ([ZFCommonHelper isExistFile:FILE_PATH(name)]) { // 已经下载过一次
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"该文件已下载,是否重新下载?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        dispatch_async(dispatch_get_main_queue(), ^{
            [alert show];
        });
        return;
    }
    // 存在于临时文件夹里
    NSString *tempfilePath = [TEMP_PATH(name) stringByAppendingString:@".plist"];
    if ([ZFCommonHelper isExistFile:tempfilePath]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"该文件已经在下载列表中了,是否重新下载?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        dispatch_async(dispatch_get_main_queue(), ^{
            [alert show];
        });
        return;
    }
    // 若不存在文件和临时文件,则是新的下载
    [self.filelist addObject:_fileInfo];
    // 开始下载
    [self startLoad];
    if (self.VCdelegate && [self.VCdelegate respondsToSelector:@selector(allowNextRequest)]) {
        [self.VCdelegate allowNextRequest];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"该文件成功添加到下载队列" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        dispatch_async(dispatch_get_main_queue(), ^{
            [alert show];
        });
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( 0.8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [alert dismissWithClickedButtonIndex:0 animated:YES];
        });
    }
    return;
}
#pragma mark - 下载开始
- (void)beginRequest:(ZFFileModel *)fileInfo isBeginDown:(BOOL)isBeginDown
{
    for(ZFHttpRequest *tempRequest in self.downinglist)
    {
        /**
         * 注意这里判读是否是同一下载的方法,asihttprequest有三种url: url,originalurl,redirectURL
         * 经过实践,应该使用originalurl,就是最先获得到的原下载地址
         **/
        if([[[tempRequest.url absoluteString] lastPathComponent] isEqualToString:[fileInfo.fileURL lastPathComponent]])
        {
            if ([tempRequest isExecuting] && isBeginDown) {
                return;
            } else if ([tempRequest isExecuting] && !isBeginDown) {
                [tempRequest setUserInfo:[NSDictionary dictionaryWithObject:fileInfo forKey:@"File"]];
                [tempRequest cancel];
                [self.downloadDelegate updateCellProgress:tempRequest];
                return;
            }
        }
    }
    [self saveDownloadFile:fileInfo];
    // 按照获取的文件名获取临时文件的大小,即已下载的大小
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSData *fileData = [fileManager contentsAtPath:fileInfo.tempPath];
    NSInteger receivedDataLength = [fileData length];
    fileInfo.fileReceivedSize = [NSString stringWithFormat:@"%zd", receivedDataLength];
    // NSLog(@"start down:已经下载:%@",fileInfo.fileReceivedSize);
    ZFHttpRequest *midRequest = [[ZFHttpRequest alloc] initWithURL:[NSURL URLWithString:fileInfo.fileURL]];
    midRequest.downloadDestinationPath = FILE_PATH(fileInfo.fileName);
    midRequest.temporaryFileDownloadPath = fileInfo.tempPath;
    midRequest.delegate = self;
    [midRequest setUserInfo:[NSDictionary dictionaryWithObject:fileInfo forKey:@"File"]];//设置上下文的文件基本信息
    if (isBeginDown) { [midRequest startAsynchronous]; }
    // 如果文件重复下载或暂停、继续,则把队列中的请求删除,重新添加
    BOOL exit = NO;
    for (ZFHttpRequest *tempRequest in self.downinglist) {
        if([[[tempRequest.url absoluteString] lastPathComponent] isEqualToString:[fileInfo.fileURL lastPathComponent]]) {
            [self.downinglist replaceObjectAtIndex:[_downinglist indexOfObject:tempRequest] withObject:midRequest];
            exit = YES;
            break;
        }
    }
    if (!exit) { [self.downinglist addObject:midRequest]; }
    [self.downloadDelegate updateCellProgress:midRequest];
}
#pragma mark - 存储下载信息到一个plist文件
- (void)saveDownloadFile:(ZFFileModel*)fileinfo
{
    NSData *imagedata = UIImagePNGRepresentation(fileinfo.fileimage);
    NSDictionary *filedic = [NSDictionary dictionaryWithObjectsAndKeys:fileinfo.fileName,@"filename",
                             fileinfo.fileURL,@"fileurl",
                             fileinfo.time,@"time",
                             fileinfo.fileSize,@"filesize",
                             fileinfo.fileReceivedSize,@"filerecievesize",
                             imagedata,@"fileimage",nil];
    NSString *plistPath = [fileinfo.tempPath stringByAppendingPathExtension:@"plist"];
    if (![filedic writeToFile:plistPath atomically:YES]) {
        NSLog(@"write plist fail");
    }
}
#pragma mark - 自动处理下载状态的算法
/*下载状态的逻辑是这样的:三种状态,下载中,等待下载,停止下载
 当超过最大下载数时,继续添加的下载会进入等待状态,当同时下载数少于最大限制时会自动开始下载等待状态的任务。
 可以主动切换下载状态
 所有任务以添加时间排序。
 */
- (void)startLoad
{
    NSInteger num = 0;
    NSInteger max = _maxCount;
    for (ZFFileModel *file in _filelist) {
        if (!file.error) {
            if (file.downloadState == ZFDownloading) {
                if (num >= max) {
                    file.downloadState = ZFWillDownload;
                } else {
                    num++;
                }
            }
        }
    }
    if (num < max) {
        for (ZFFileModel *file in _filelist) {
            if (!file.error) {
                if (file.downloadState == ZFWillDownload) {
                    num++;
                    if (num>max) {
                        break;
                    }
                    file.downloadState = ZFDownloading;
                }
            }
        }
    }
    for (ZFFileModel *file in _filelist) {
        if (!file.error) {
            if (file.downloadState == ZFDownloading) {
                [self beginRequest:file isBeginDown:YES];
            } else {
                [self beginRequest:file isBeginDown:NO];
            }
        }
    }
    self.count = [_filelist count];
}
#pragma mark - 恢复下载
- (void)resumeRequest:(ZFHttpRequest *)request
{
    NSInteger max = _maxCount;
    ZFFileModel *fileInfo = [request.userInfo objectForKey:@"File"];
    NSInteger downingcount = 0;
    NSInteger indexmax = -1;
    for (ZFFileModel *file in _filelist) {
        if (file.downloadState == ZFDownloading) {
            downingcount++;
            if (downingcount==max) {
                indexmax = [_filelist indexOfObject:file];
            }
        }
    }
    // 此时下载中数目是否是最大,并获得最大时的位置Index
    if (downingcount == max) {
        ZFFileModel *file  = [_filelist objectAtIndex:indexmax];
        if (file.downloadState == ZFDownloading) {
            file.downloadState = ZFWillDownload;
        }
    }
    // 中止一个进程使其进入等待
    for (ZFFileModel *file in _filelist) {
        if ([file.fileName isEqualToString:fileInfo.fileName]) {
            file.downloadState = ZFDownloading;
            file.error = NO;
        }
    }
    // 重新开始此下载
    [self startLoad];
}
#pragma mark - 暂停下载
- (void)stopRequest:(ZFHttpRequest *)request
{
    NSInteger max = self.maxCount;
    if([request isExecuting]) {
        [request cancel];
    }
    ZFFileModel *fileInfo = [request.userInfo objectForKey:@"File"];
    for (ZFFileModel *file in _filelist) {
        if ([file.fileName isEqualToString:fileInfo.fileName]) {
            file.downloadState = ZFStopDownload;
            break;
        }
    }
    NSInteger downingcount = 0;
    for (ZFFileModel *file in _filelist) {
        if (file.downloadState == ZFDownloading) {
            downingcount++;
        }
    }
    if (downingcount < max) {
        for (ZFFileModel *file in _filelist) {
            if (file.downloadState == ZFWillDownload){
                file.downloadState = ZFDownloading;
                break;
            }
        }
    }
    [self startLoad];
}
#pragma mark - 删除下载
- (void)deleteRequest:(ZFHttpRequest *)request
{
    BOOL isexecuting = NO;
    if([request isExecuting]) {
        [request cancel];
        isexecuting = YES;
    }
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    ZFFileModel *fileInfo = (ZFFileModel*)[request.userInfo objectForKey:@"File"];
    NSString *path = fileInfo.tempPath;
    NSString *configPath = [NSString stringWithFormat:@"%@.plist",path];
    [fileManager removeItemAtPath:path error:&error];
    [fileManager removeItemAtPath:configPath error:&error];
    if(!error){ NSLog(@"%@",[error description]);}
    NSInteger delindex = -1;
    for (ZFFileModel *file in _filelist) {
        if ([file.fileName isEqualToString:fileInfo.fileName]) {
            delindex = [_filelist indexOfObject:file];
            break;
        }
    }
    if (delindex != NSNotFound)
        [_filelist removeObjectAtIndex:delindex];
    [_downinglist removeObject:request];
    if (isexecuting) {
        [self startLoad];
    }
    self.count = [_filelist count];
}
#pragma mark - 可能的UI操作接口
- (void)clearAllFinished
{
    [_finishedlist removeAllObjects];
}
- (void)clearAllRquests
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    for (ZFHttpRequest *request in _downinglist) {
        if([request isExecuting])
            [request cancel];
        ZFFileModel *fileInfo = (ZFFileModel*)[request.userInfo objectForKey:@"File"];
        NSString *path = fileInfo.tempPath;;
        NSString *configPath = [NSString stringWithFormat:@"%@.plist",path];
        [fileManager removeItemAtPath:path error:&error];
        [fileManager removeItemAtPath:configPath error:&error];
        if(!error)
        {
            NSLog(@"%@",[error description]);
        }
    }
    [_downinglist removeAllObjects];
    [_filelist removeAllObjects];
}
- (void)startAllDownloads
{
    for (ZFHttpRequest *request in _downinglist) {
        if([request isExecuting]) {
            [request cancel];
        }
        ZFFileModel *fileInfo = [request.userInfo objectForKey:@"File"];
        fileInfo.downloadState = ZFDownloading;
    }
    [self startLoad];
}
- (void)pauseAllDownloads
{
    for (ZFHttpRequest *request in _downinglist) {
        if([request isExecuting]) {
            [request cancel];
        }
        ZFFileModel *fileInfo = [request.userInfo objectForKey:@"File"];
        fileInfo.downloadState = ZFStopDownload;
    }
    [self startLoad];
}
#pragma mark - 从这里获取上次未完成下载的信息
/*
 将本地的未下载完成的临时文件加载到正在下载列表里,但是不接着开始下载
 */
- (void)loadTempfiles
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *filelist = [fileManager contentsOfDirectoryAtPath:TEMP_FOLDER error:&error];
    if(!error)
    {
        NSLog(@"%@",[error description]);
    }
    NSMutableArray *filearr = [[NSMutableArray alloc]init];
    for(NSString *file in filelist) {
        NSString *filetype = [file  pathExtension];
        if([filetype isEqualToString:@"plist"])
            [filearr addObject:[self getTempfile:TEMP_PATH(file)]];
    }
    NSArray* arr =  [self sortbyTime:(NSArray *)filearr];
    [_filelist addObjectsFromArray:arr];
    [self startLoad];
}
- (ZFFileModel *)getTempfile:(NSString *)path
{
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];
    ZFFileModel *file = [[ZFFileModel alloc]init];
    file.fileName = [dic objectForKey:@"filename"];
    file.fileType = [file.fileName pathExtension ];
    file.fileURL = [dic objectForKey:@"fileurl"];
    file.fileSize = [dic objectForKey:@"filesize"];
    file.fileReceivedSize = [dic objectForKey:@"filerecievesize"];
    file.tempPath = TEMP_PATH(file.fileName);
    file.time = [dic objectForKey:@"time"];
    file.fileimage = [UIImage imageWithData:[dic objectForKey:@"fileimage"]];
    file.downloadState = ZFStopDownload;
    file.error = NO;
    NSData *fileData = [[NSFileManager defaultManager ] contentsAtPath:file.tempPath];
    NSInteger receivedDataLength = [fileData length];
    file.fileReceivedSize = [NSString stringWithFormat:@"%zd",receivedDataLength];
    return file;
}
- (NSArray *)sortbyTime:(NSArray *)array
{
    NSArray *sorteArray1 = [array sortedArrayUsingComparator:^(id obj1, id obj2){
        ZFFileModel *file1 = (ZFFileModel *)obj1;
        ZFFileModel *file2 = (ZFFileModel *)obj2;
        NSDate *date1 = [ZFCommonHelper makeDate:file1.time];
        NSDate *date2 = [ZFCommonHelper makeDate:file2.time];
        if ([[date1 earlierDate:date2]isEqualToDate:date2]) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        if ([[date1 earlierDate:date2]isEqualToDate:date1]) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];
    return sorteArray1;
}
#pragma mark - 已完成的下载任务在这里处理
/*
   将本地已经下载完成的文件加载到已下载列表里
 */
- (void)loadFinishedfiles
{
    if ([[NSFileManager defaultManager] fileExistsAtPath:PLIST_PATH]) {
        NSMutableArray *finishArr = [[NSMutableArray alloc] initWithContentsOfFile:PLIST_PATH];
        for (NSDictionary *dic in finishArr) {
            ZFFileModel *file = [[ZFFileModel alloc]init];
            file.fileName = [dic objectForKey:@"filename"];
            file.fileType = [file.fileName pathExtension];
            file.fileSize = [dic objectForKey:@"filesize"];
            file.time = [dic objectForKey:@"time"];
            file.fileimage = [UIImage imageWithData:[dic objectForKey:@"fileimage"]];
            [_finishedlist addObject:file];
        }
    }
}
- (void)saveFinishedFile
{
    if (_finishedlist == nil) { return; }
    NSMutableArray *finishedinfo = [[NSMutableArray alloc] init];
    for (ZFFileModel *fileinfo in _finishedlist) {
        NSData *imagedata = UIImagePNGRepresentation(fileinfo.fileimage);
        NSDictionary *filedic = [NSDictionary dictionaryWithObjectsAndKeys: fileinfo.fileName,@"filename",
                                 fileinfo.time,@"time",
                                 fileinfo.fileSize,@"filesize",
                                 imagedata,@"fileimage", nil];
        [finishedinfo addObject:filedic];
    }
    if (![finishedinfo writeToFile:PLIST_PATH atomically:YES]) {
        NSLog(@"write plist fail");
    }
}
- (void)deleteFinishFile:(ZFFileModel *)selectFile
{
    [_finishedlist removeObject:selectFile];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = FILE_PATH(selectFile.fileName);
    if ([fm fileExistsAtPath:path]) {
        [fm removeItemAtPath:path error:nil];
    }
    [self saveFinishedFile];
}
#pragma mark -- ASIHttpRequest回调委托 --
// 出错了,如果是等待超时,则继续下载
- (void)requestFailed:(ZFHttpRequest *)request
{
    NSError *error=[request error];
    NSLog(@"ASIHttpRequest出错了!%@",error);
    if (error.code==4) { return; }
    if ([request isExecuting]) { [request cancel]; }
    ZFFileModel *fileInfo =  [request.userInfo objectForKey:@"File"];
    fileInfo.downloadState = ZFStopDownload;
    fileInfo.error = YES;
    for (ZFFileModel *file in _filelist) {
        if ([file.fileName isEqualToString:fileInfo.fileName]) {
            file.downloadState = ZFStopDownload;
            file.error = YES;
        }
    }
    [self.downloadDelegate updateCellProgress:request];
}
- (void)requestStarted:(ZFHttpRequest *)request
{
    NSLog(@"开始了!");
}
- (void)request:(ZFHttpRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders
{
    NSLog(@"收到回复了!");
    ZFFileModel *fileInfo = [request.userInfo objectForKey:@"File"];
    fileInfo.isFirstReceived = YES;
    NSString *len = [responseHeaders objectForKey:@"Content-Length"];
    // 这个信息头,首次收到的为总大小,那么后来续传时收到的大小为肯定小于或等于首次的值,则忽略
    if ([fileInfo.fileSize longLongValue] > [len longLongValue]){ return; }
    fileInfo.fileSize = [NSString stringWithFormat:@"%lld", [len longLongValue]];
    [self saveDownloadFile:fileInfo];
}
- (void)request:(ZFHttpRequest *)request didReceiveBytes:(long long)bytes
{
    ZFFileModel *fileInfo = [request.userInfo objectForKey:@"File"];
    NSLog(@"%@,%lld",fileInfo.fileReceivedSize,bytes);
    if (fileInfo.isFirstReceived) {
        fileInfo.isFirstReceived = NO;
        fileInfo.fileReceivedSize = [NSString stringWithFormat:@"%lld",bytes];
    } else if(!fileInfo.isFirstReceived) {
        fileInfo.fileReceivedSize = [NSString stringWithFormat:@"%lld",[fileInfo.fileReceivedSize longLongValue]+bytes];
    }
    if([self.downloadDelegate respondsToSelector:@selector(updateCellProgress:)]) {
        [self.downloadDelegate updateCellProgress:request];
    }
}
// 将正在下载的文件请求ASIHttpRequest从队列里移除,并将其配置文件删除掉,然后向已下载列表里添加该文件对象
- (void)requestFinished:(ZFHttpRequest *)request
{
    ZFFileModel *fileInfo = (ZFFileModel *)[request.userInfo objectForKey:@"File"];
    [_finishedlist addObject:fileInfo];
    NSString *configPath = [fileInfo.tempPath stringByAppendingString:@".plist"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    if([fileManager fileExistsAtPath:configPath]) //如果存在临时文件的配置文件
    {
        [fileManager removeItemAtPath:configPath error:&error];
        if(!error) { NSLog(@"%@",[error description]); }
    }
    [_filelist removeObject:fileInfo];
    [_downinglist removeObject:request];
    [self saveFinishedFile];
    [self startLoad];
    if([self.downloadDelegate respondsToSelector:@selector(finishedDownload:)]) {
        [self.downloadDelegate finishedDownload:request];
    }
}
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    // 确定按钮
    if( buttonIndex == 1 ) {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSError *error;
        NSInteger delindex = -1;
        NSString *path = FILE_PATH(_fileInfo.fileName);
        if([ZFCommonHelper isExistFile:path]) { //已经下载过一次该文件
            for (ZFFileModel *info in _finishedlist) {
                if ([info.fileName isEqualToString:_fileInfo.fileName]) {
                    // 删除文件
                    [self deleteFinishFile:info];
                }
            }
        } else { // 如果正在下载中,择重新下载
            for(ZFHttpRequest *request in self.downinglist) {
                ZFFileModel *ZFFileModel = [request.userInfo objectForKey:@"File"];
                if([ZFFileModel.fileName isEqualToString:_fileInfo.fileName])
                {
                    if ([request isExecuting]) {
                        [request cancel];
                    }
                    delindex = [_downinglist indexOfObject:request];
                    break;
                }
            }
            [_downinglist removeObjectAtIndex:delindex];
            for (ZFFileModel *file in _filelist) {
                if ([file.fileName isEqualToString:_fileInfo.fileName]) {
                    delindex = [_filelist indexOfObject:file];
                    break;
                }
            }
            [_filelist removeObjectAtIndex:delindex];
            // 存在于临时文件夹里
            NSString * tempfilePath = [_fileInfo.tempPath stringByAppendingString:@".plist"];
            if([ZFCommonHelper isExistFile:tempfilePath])
            {
                if (![fileManager removeItemAtPath:tempfilePath error:&error]) {
                    NSLog(@"删除临时文件出错:%@",[error localizedDescription]);
                }
            }
            if([ZFCommonHelper isExistFile:_fileInfo.tempPath])
            {
                if (![fileManager removeItemAtPath:_fileInfo.tempPath error:&error]) {
                    NSLog(@"删除临时文件出错:%@",[error localizedDescription]);
                }
            }
        }
        self.fileInfo.fileReceivedSize = [ZFCommonHelper getFileSizeString:@"0"];
        [_filelist addObject:_fileInfo];
        [self startLoad];
    }
    if (self.VCdelegate!=nil && [self.VCdelegate respondsToSelector:@selector(allowNextRequest)]) {
        [self.VCdelegate allowNextRequest];
    }
}
#pragma mark - setter
- (void)setMaxCount:(NSInteger)maxCount
{
    _maxCount = maxCount;
    [[NSUserDefaults standardUserDefaults] setValue:@(maxCount) forKey:kMaxRequestCount];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [[ZFDownloadManager sharedDownloadManager] startLoad];
}
@end