IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)

来源:互联网 发布:教育软件下载 编辑:程序博客网 时间:2024/05/22 01:16

     在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐、下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://blog.csdn.net/pjk1129/article/details/6575588中有具体的介绍,今天重点介绍如何实现,废话少说,开始正文:

   一、创建网络请求队列

    首先,创建网络请求队列,如下:

    ASINetworkQueue   *que = [[ASINetworkQueue alloc] init];    self.netWorkQueue = que;    [que release];        [self.netWorkQueue reset];    [self.netWorkQueue setShowAccurateProgress:YES];    [self.netWorkQueue go];  二、创建存放路径    //初始化Documents路径NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];//初始化临时文件路径NSString *folderPath = [path stringByAppendingPathComponent:@"temp"];//创建文件管理器NSFileManager *fileManager = [NSFileManager defaultManager];//判断temp文件夹是否存在BOOL fileExists = [fileManager fileExistsAtPath:folderPath];if (!fileExists) {//如果不存在说创建,因为下载时,不会自动创建文件夹[fileManager createDirectoryAtPath:folderPath                withIntermediateDirectories:YES                                 attributes:nil                                     error:nil];}


   三、发送下载请求

        这里对下面几个对象说明一下:CustomCell是我自定义的cell,cell上面有下载和暂停两个按钮,其tag值为cell所在的行,因此这里的[sendertag]为下载按钮的tag值,self.downloadArray为array数组对象,存放要下载的资源字典信息,在该字典中有一键为URL,它对应的值就是我们下载链接。

   这些东西,根据自己的实际需要改动一下即可使用

 CustomCell *cell = (CustomCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];    NSString  *filePath = [[self.downloadArray objectAtIndex:[sender tag]] objectForKey:@"URL"];    NSLog(@"filePath=%@",filePath);    //初始下载路径NSURL *url = [NSURL URLWithString:filePath];//设置下载路径ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:url];//设置ASIHTTPRequest代理request.delegate = self;    //初始化保存ZIP文件路径NSString *savePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"book_%d.zip",[sender tag]]];//初始化临时文件路径NSString *tempPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"temp/book_%d.zip.temp",[sender tag]]];//设置文件保存路径[request setDownloadDestinationPath:savePath];//设置临时文件路径[request setTemporaryFileDownloadPath:tempPath];        //设置进度条的代理,[request setDownloadProgressDelegate:cell];//设置是是否支持断点下载[request setAllowResumeForFileDownloads:YES];//设置基本信息[request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:[sender tag]],@"bookID",nil]];        NSLog(@"UserInfo=%@",request.userInfo);//添加到ASINetworkQueue队列去下载[self.netWorkQueue addOperation:request];//收回request[request release];

三、暂停请求这里的cell下下载时的一样,

CustomCell *cell = (CustomCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];        for (ASIHTTPRequest *request in [self.netWorkQueue operations]) {        NSInteger bookid = [[request.userInfo objectForKey:@"bookID"] intValue];//查看userinfo信息        if ([sender tag] == bookid) {//判断ID是否匹配            //暂停匹配对象            [request clearDelegatesAndCancel];        }    }

 四、ASIHTTPRequestDelegate回调方法

上面已经把下载请求与暂停请求实现,点击下载时,开始下载资源;当点暂停时,下载中断;当我们再点击下载按钮时,继续下载,在第二步的

[request setAllowResumeForFileDownloads:YES]设置是是否支持断点下载。下面要实现ASIHTTPRequestDelegate代理方法如下:#pragma mark -#pragma mark ASIHTTPRequestDelegate method//ASIHTTPRequestDelegate,下载之前获取信息的方法,主要获取下载内容的大小,可以显示下载进度多少字节- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders {NSLog(@"didReceiveResponseHeaders-%@",[responseHeaders valueForKey:@"Content-Length"]);    NSLog(@"contentlength=%f",request.contentLength/1024.0/1024.0);    int bookid = [[request.userInfo objectForKey:@"bookID"] intValue];    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];    float tempConLen = [[userDefaults objectForKey:[NSString stringWithFormat:@"book_%d_contentLength",bookid]] floatValue];    NSLog(@"tempConLen=%f",tempConLen);    //如果没有保存,则持久化他的内容大小    if (tempConLen == 0 ) {//如果没有保存,则持久化他的内容大小        [userDefaults setObject:[NSNumber numberWithFloat:request.contentLength/1024.0/1024.0] forKey:[NSString stringWithFormat:@"book_%d_contentLength",bookid]];    }}//ASIHTTPRequestDelegate,下载完成时,执行的方法- (void)requestFinished:(ASIHTTPRequest *)request {        int bookid = [[request.userInfo objectForKey:@"bookID"] intValue];    CustomCell *cell = (CustomCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:bookid inSection:0]];    cell.downloadCompleteStatus = YES;    cell.progressView.progress = 0.0; }

    经过上述步骤,一个支持断点续传的功能程序实现了!

原创粉丝点击