(项目实践)使用ASIHTTPRequest 实现断点续传

在面试过程中遇到一个断点续传的需求,以前没做过,就大概说了一下思路:

 1.设置一个临时路径用来存储下载过程中的文件

 2.当下载完后会把这个文件拷贝到目的路径中,并删除临时路径中的文件

 3.每次执行下载都会到临时路径中寻找要下载的文件是否存在,下载的进度tag值之类的等等。。。

然后就会在此基础上继续下载,如果不存在就直接从原始地址下载。回去后,自己在项目中实践了一下,以下是主要代码实现:(有注释)

- (void)viewDidLoad
{
    [superviewDidLoad];
self.title
= @"断点续传";
self.startButton
= [UIButtonbuttonWithType:UIButtonTypeRoundedRect]; self.startButton.frame =CGRectMake(70, 220, 80, 42); [self.startButtonsetTitle:@"开始"forState:UIControlStateNormal]; self.startButton.adjustsImageWhenHighlighted = NO; self.startButton.adjustsImageWhenDisabled = NO; self.startButton.showsTouchWhenHighlighted = YES; [self.startButtonaddTarget:selfaction:@selector(strat:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.startButton]; self.stopButton = [UIButtonbuttonWithType:UIButtonTypeRoundedRect]; self.stopButton.frame =CGRectMake(180, 220, 80, 42); [self.stopButtonsetTitle:@"暂停"forState:UIControlStateNormal]; self.stopButton.adjustsImageWhenHighlighted = NO; self.stopButton.adjustsImageWhenDisabled = NO; self.stopButton.showsTouchWhenHighlighted = YES; [self.stopButtonaddTarget:selfaction:@selector(stop:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.stopButton];
self.progressView
= [[UIProgressViewalloc] initWithFrame:CGRectMake(100, 100, 150, 20)]; [self.progressViewsetProgressViewStyle:UIProgressViewStyleDefault]; //设置进度条类型 [self.viewaddSubview:self.progressView]; _asiQueue = [[ASINetworkQueuealloc]init];//开启队列 [_asiQueue reset];//nil _asiQueue.showAccurateProgress=YES;//进度 [_asiQueue go]; }

 

- (void)down{
    NSURL *url = [NSURLURLWithString:@"http://mp3downb.111ttt.com/2011/myxc/20110126/507.mp4"];//请求地址
    _asiHttpRequest=[ASIHTTPRequestrequestWithURL:url];
    _asiHttpRequest.delegate=self;
    _asiHttpRequest.downloadProgressDelegate=self;//下载进度的代理,用于断点续传

//    NSString *downloadPath=@"下载的路径";
//    NSString *tempPath=@"临时路径";//缓存路径,断点会打在这里面
     path = NSHomeDirectory();//该方法得到的是应用程序目录的路径
    //目的路径,设置一个目的路径用来存储下载下来的文件
    NSString *savePath = [pathstringByAppendingPathComponent:@"aaa.mp3"];
    /*
        临时路径:
            1.设置一个临时路径用来存储下载过程中的文件
            2.当下载完后会把这个文件拷贝到目的路径中,并删除临时路径中的文件
            3.断点续传:当设置断点续传的属性为YES后,每次执行都会到临时路径中寻找要下载的文件是否存在,下载的进度等等。。。然后就会在此基础上继续下载,从而实现续传的效果
     设置临时路径在这个过程中是相当重要的。。。
     */
    NSString *temp = [pathstringByAppendingPathComponent:@"temp"];

    /*
        又在临时路径中添加了一个mp3格式的文件,这就相当于设置了一个假的要下载的文件,其实是不存在的,可以这么理解:这里提供了一个容器,下载的内容填充到了这个容器中。
        这个容器是必须要设置的,要不然它会不知道要下载到什么里面。。。
        会有人说:问什么不和上面的临时路径拚在一起,不是一样么:NSString *temp = [path stringByAppendingPathComponent:@"temp/aaa.mp3"];
        这是不行的,因为你的临时路径必须要保证是正确的、是拥有的,所以在下面你要用NSFileManager来判断是否存在这么一个路径,如果不存在就去创建,
        当你创建的时候会把qgw.mp3当作是一个文件夹来创建的,所以每次断点续传的时候都会进入到qgw.mp3这个文件夹中寻找,当然是找不到的(因为qwg.mp3就是)
        so,要分开来写。。。
     */
    NSString *tempPath = [temp stringByAppendingPathComponent:@"aaa.mp3"];

    //创建文件管理器
    NSFileManager *fileManager = [NSFileManagerdefaultManager];
    //判断temp文件夹是否存在
    BOOL fileExists = [fileManager fileExistsAtPath:temp];
    if (!fileExists)
    {//如果不存在则创建,因为下载时,不会自动创建文件夹
        [fileManager createDirectoryAtPath:temp
               withIntermediateDirectories:YES
                                attributes:nil
                                     error:nil];
    }
    [ _asiHttpRequestsetDownloadDestinationPath:savePath ];//下载路径
    [ _asiHttpRequestsetTemporaryFileDownloadPath:tempPath ];//临时路径,一定要设置临时路径。。
    _asiHttpRequest.allowResumeForFileDownloads = YES;//打开断点,是否要断点续传

    //进度条
    _progressView.alpha = 1.0f;
    _progressView.progress=0;//赋值为0    

    [_asiQueue addOperation:_asiHttpRequest];//加入队列
}

 

//代理方法,得到下载进度
- (void)setProgress:(float)newProgress{
    [_progressView setProgress:newProgress];//赋给进度条
    NSLog(@"progress=%lf",newProgress);
}

 

最后,由于第一次发帖,不知道如何添加下载链接。求热心指导!@focuse谢谢!

posted @ 2013-10-28 16:02  focuse  阅读(285)  评论(0)    收藏  举报