ASIHttpRequest:创建队列、下载请求、断点续传、解压缩

下面是我们今天要完成的任务:

  1. 下载指定链接的zip压缩文件
  2. 存放在Documents目录下
  3. 支持断点续传
  4. 显示下载进度
  5. 解压到指定目录

那就开始吧,首先我们要创建一个ASINetworkQueue全局队列,队列里可以添加请求,虽然今天只会用到一个请求,但我们迟早会用到队列,不妨现在就开始创建:

- (void)viewDidLoad

{

queue = [[ASINetworkQueue alloc] init];

//设置支持较高精度的进度追踪

[queue setShowAccurateProgress:YES];

//启动

//启动后,添加到队列的请求会自动执行

[queue go];

}

紧接着创建我们的下载请求:

- (IBAction)startDownload

{

//Documents路径

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

//下载路径

downloadPath = [[path stringByAppendingPathComponent:@"book.zip"] retain];

//要支持断点续传,缓存路径是不能少的。

NSString *tempPath = [path stringByAppendingPathComponent:@"book.temp"];

//下载链接

NSURL *url = [NSURL URLWithString:@"http://cnread.net/cnread1/lszl/s/simaguang/zztj/zztj.zip"];

//创建请求

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

//设置代理,别忘了在头文件里添加ASIHTTPRequestDelegate协议

request.delegate = self;

//设置下载路径

[request setDownloadDestinationPath:downloadPath];

//设置缓存路径

[request setTemporaryFileDownloadPath:tempPath];

//设置支持断点续传

[request setAllowResumeForFileDownloads:YES];

//下载进度代理可以直接用UIProgressView对象,它会自动更新,如果你想做更多的处理

//就必须用我们自定义的类,只要我们的类里实现了setPorgress:方法

request.downloadProgressDelegate = self;

//将请求添加到之前创建的队列里,这时请求已经开始执行了

//队列会retain添加进去的请求

[queue addOperation:request];

}

由于我们没有设置代理方法,request会执行下列默认代理方法:

//请求开始

- (void)requestStarted:(ASIHTTPRequest *)request;

//请求收到响应的头部,主要包括文件大小信息,下面会用到

- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;

//请求将被重定向

- (void)request:(ASIHTTPRequest *)request willRedirectToURL:(NSURL *)newURL;

//请求完成

- (void)requestFinished:(ASIHTTPRequest *)request;

//请求失败

- (void)requestFailed:(ASIHTTPRequest *)request;

//请求已被重定向

- (void)requestRedirected:(ASIHTTPRequest *)request;

下面是我们对头部信息的处理

- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders

{

NSLog(@”%@”,responseHeaders);

if (fileLength == 0) {

fileLength = request.contentLength/1024.0/1024.0;

totalPro.text = [NSString stringWithFormat:@"%.2fM",fileLength];

}

}

这是打印的结果:

{

“Accept-Ranges” = bytes;

“Content-Length” = 4380152;

“Content-Type” = “application/x-zip-compressed”;

Date = “Fri, 25 Nov 2011 11:43:20 GMT”;

Etag = “\”16d81c5cba6c71:78c\”";

“Last-Modified” = “Sun, 03 Jun 2007 18:16:52 GMT”;

Server = “Microsoft-IIS/6.0″;

“X-Powered-By” = “ASP.NET”;

}

我们可以从中看到文件大小等一些请求信息,这时request自己也知道了文件大小,所以我们直接使用request的contentLength属性,放心,大小是一样的!

经过测试,缓存文件是在收到头部后创建的。

这是处理进度的方法(request会自动调用该方法):

- (void)setProgress:(float)newProgress

{

progressView.progress = newProgress;

currentPro.text = [NSString stringWithFormat:@"%.2fM",fileLength*newProgress];

}

这样我们就可以看到进度了:

界面比较简陋,见笑了。。。

下面是我们的暂停方法

- (IBAction)pauseDownload

{

//operations方法返回队列里的所有请求,但我们只有一个请求

ASIHTTPRequest *request = [[queue operations] objectAtIndex:0];

//取消请求

[request clearDelegatesAndCancel];

}

你可能注意到了一个问题,因为我们的队列里只有一个请求,所以很容易获取。如果请求多了,我们应该怎么区分队列里的请求呢?有两个方法:

  1. 设置request的tag属性,就像UIView的tag一样方便,但是扩展性不强;
  2. 设置request的userInfo属性,它是个NSDictionary对象,下面不用我说了吧。

还有一件事,我们使用了clearDelegatesAndCancel方法来取消请求,我们本可以用cancel方法来达到同样的目的,但后者会使request触发代理方法requestFailed:,而前者会首先重置request的所有代理然后执行cancel方法,所以不会触发代理方法。

这里还要说一下,如果你的request代理在request被取消之前释放,那么代理方法被触发的时候就会crash!如果必须释放你的代理,请确定执行了clearDelegatesAndCancel方法!

还应该注意,这里说是暂停,其实request已经完全被取消了!下面说说断点续传是怎么回事。

其实,断点续传的功能我们在上面的代码里已经实现了。不信?

因为我们之前开启了断点续传,并且设置了缓存路径,所以request取消时就会在缓存文件里打断点,当我们在次执行上面的startDownload方法时,缓存路径还是之前的缓存路径,request会自动从缓存文件中的断点后开始下载,头部中的文件大小值也是从断点之后开始算的。神奇吧,ASIHTTPRequest已经为你打点好了一切。

继续,当请求完成时,也就是我们的文件已经下载好了的时候,下载好的文件会在我们之前指定的下载路径下生成,同时缓存文件会被删除,具体谁先谁后目前还没有弄清楚。

现在我们的压缩文件已经下载好了,可怎么打开呢,双击?NO,继续:

为了使用解压缩,我引用了第三方类库:

解压缩的代码如下:

- (IBAction)unzipFile

{

//初始化Documents路径

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

//创建文件夹路径,这将是解压的目的路径

unzipPath = [[path stringByAppendingPathComponent:@"bookUnzip"] retain];

//创建解压器

ZipArchive *unzip = [[ZipArchive alloc] init];

if ([unzip UnzipOpenFile:downloadPath]) {

//解压

BOOL result = [unzip UnzipFileTo:unzipPath overWrite:YES];

if (result) {

NSLog(@”解压成功!”);

}

[unzip UnzipCloseFile];

}

[unzip release];

}

OK!解压成功,现在应该可以看到解压后的文件了:

时间: 2024-10-09 19:09:26

ASIHttpRequest:创建队列、下载请求、断点续传、解压缩的相关文章

ASIHTTPRequest下载之断点续传

使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互. 导入第三方ASIHTTPRequset文件后,需要添加某些类库 再添加-fno-objc-arc使它不检测ARC 导入ASIHTTPRequ

ASIHTTPRequest 详解, http 请求终结者

转:http://www.cnblogs.com/chen1987lei/archive/2011/06/07/2074636.html ASIHTTPRequest是一款极其强劲的HTTP访问开源项目.让简单的API完成复杂的功能, 如:异步请求,队列请求,GZIP压缩,缓存,断点续传,进度跟踪,上传文件,HTTP认证在新的版本中,还加入了Objective-C闭包Block的支持,让我们的代码更加轻简灵活. 下面就举例说明它的API用法. 发起一个同步请求同步意为着线程阻塞,在主线程中使用此

ASINetworkQueue 队列下载

我们通过一个例子介绍一下请求队列使用,我们设计了一个应用,用户点击GO按钮从服务器同时下载两张图片显示在画面中. 我们直接看看主视图控制器ViewController.h代码如下: #import “ASIHTTPRequest.h” #import “ASINetworkQueue.h” #import “NSNumber+Message.h” #import “NSString+URLEncoding.h” @interface ViewController : UIViewControll

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

【幻化万千戏红尘】qianfengDay27-HttpURLConnection,OkHttpClient,,多线程下载且断点续传基础学习:

课程回顾: Servlet:java语言开发的运行在服务器上的开发步骤:1.创建Servlet类2.重写doGet或doPost方法3.运行在服务器 生命周期:1.初始化2.服务3.销毁 URL:统一资源定位符,网址openConnection 今日内容:Http协议:超文本传输协议常用方式:1.HttpURLConnection2.okHttp HttpURLConnection的使用步骤:1.创建URL对象---URL url=new URL("网址");2.获取连接对象--Htt

WorldWind源码剖析系列:下载请求类DownloadRequest

下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadRequest(抽象类),再派生出地形下载请求类TerrainDownloadRequest.这些类的类图如下. 抽象基类下载请求类DownloadRequest 抽象基类下载请求类DownloadRequest各个字段和属性的含义说明如下: internal static DownloadQueue Queu

android开发笔记之多线程下载及断点续传

今天我们来接触一下多线程下载,当然也包括断点续传,我们可以看到 很多下载器,当开通会员的时候下载东西的速度就变得快了许多,这是为什么呢?这就是跟今天讲的多线程有关系了,其实就是多开了几个线程一起下载罢了.当然真正的多线程下载要比这个复杂,要考虑很多问题. 做个不恰当的比喻: 假如我们把一个服务器上的文件看作是一个水缸里的水的话,那么多线程下载就相当于从水缸上打了多个小孔,然后塞进去小管道进行抽水.呵呵,也许这个比喻不够准确. 效果: 这里下载的是本地服务器上的文件,你们可以下载网络上的一些文件.

自己写的一个简单的迅雷下载支持断点续传

当我学习了网络线程,就自己仿照迅雷下载写了一个下载器,支持断点续传 我用的是SWT插件做的界面 界面 package com.yc.xunlei; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Arra

Nginx支持用户多线程下载和断点续传

RFC2616规范中定义了range协议,它给出一种规则使得客户端可以再一次请求中只下载完整文件的一部分,这样就支持客户端在开启多线程的同时下载一份文件,其中每个线程仅下载文件的一部分,最后组合成完整的文件,range也支持断点续传,只要客户端记录了已下载部分文件偏移量,就可以要求服务器从断点处发送文件之后的内容. Nginx对range协议支持的非常好,因为range协议主要增加了一些HTTP头部处理流程,以及发送文件时的偏移量处理.Nginx设计了HTTP过滤模块,每个请求可以由许多HTTP