您的位置:首页 > 理论基础 > 计算机网络

iOS 使用ASIHTTPRequest实现图片下载,断点续传,cell自定义

2014-04-11 15:06 543 查看
在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐、下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理,今天重点介绍如何实现,废话少说,开始正文:

  一、创建网络请求队列

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

 

 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)requestASIHTTPRequest *)request didReceiveResponseHeadersNSDictionary *)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)requestFinishedASIHTTPRequest *)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;

  }

复制代码

转自:http://www.1000phone.net/forum.php?mod=viewthread&tid=10355
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: