ASIHttpRequest:创建队列、下载请求、断点续传、解压缩
ps:本文转载自网络:http://ryan.easymorse.com/?p=12 感谢作者
工程完整代码下载地址:RequestTestDownload1
可完成:
- 下载指定链接的zip压缩文件
- 存放在Documents目录下
- 支持断点续传
- 显示下载进度
- 解压到指定目录
——————————————————————————————————————————————
首先,要想在ios项目中使用ASIHttpRequest,必须添加下列框架和类库:
- ASIHttpRequest 【库的下载地址】
- CFNetwork.framework
- SystemConfiguration.framework
- MobileCoreServices.framework
- CoreGraphics.framework
- libz.dylib【这个可能会有变动,有人在ios5.0上运行不了,在项目中添加{libz.1.2.5.dylib}】
——————————————————————————————————————————————
创建一个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];
}
你可能注意到了一个问题,因为我们的队列里只有一个请求,所以很容易获取。如果请求多了,我们应该怎么区分队列里的请求呢?有两个方法:
- 设置request的tag属性,就像UIView的tag一样方便,但是扩展性不强;
- 设置request的userInfo属性,它是个NSDictionary对象,下面不用我说了吧。
还有一件事,我们使用了clearDelegatesAndCancel方法来取消请求,我们本可以用cancel方法来达到同样的目的,但后者会使request触发代理方法requestFailed:,而前者会首先重置request的所有代理然后执行cancel方法,所以不会触发代理方法。
这里还要说一下,如果你的request代理在request被取消之前释放,那么代理方法被触发的时候就会crash!如果必须释放你的代理,请确定执行了clearDelegatesAndCancel方法!
还应该注意,这里说是暂停,其实request已经完全被取消了!下面说说断点续传是怎么回事。
其实,断点续传的功能我们在上面的代码里已经实现了。不信?
因为我们之前开启了断点续传,并且设置了缓存路径,所以request取消时就会在缓存文件里打断点,当我们在次执行上面的startDownload方法时,缓存路径还是之前的缓存路径,request会自动从缓存文件中的断点后开始下载,头部中的文件大小值也是从断点之后开始算的。神奇吧,ASIHTTPRequest已经为你打点好了一切。
继续,当请求完成时,也就是我们的文件已经下载好了的时候,下载好的文件会在我们之前指定的下载路径下生成,同时缓存文件会被删除,具体谁先谁后目前还没有弄清楚。

——————————————————————————————————————————
现在我们的压缩文件已经下载好了,可怎么打开呢,双击?NO,继续:
为了使用解压缩,我引用了第三方类库:
- ZipArchive 【库的下载地址】
解压缩的代码如下:
- (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:unzipPathoverWrite:YES];
if (result) {
NSLog(@”解压成功!”);
}
[unzip UnzipCloseFile];
}
[unzip release];
}
OK!解压成功,现在应该可以看到解压后的文件了:

参考:
- http://www.dreamingwish.com/dream-2011/powerful-asihttprequest-library-two.html
- http://www.cocoachina.com/bbs/read.php?tid=61709&keyword=ASIHttpRequest
ASIHttpRequest:创建队列、下载请求、断点续传、解压缩的更多相关文章
- ASIHTTPRequest 详解, http 请求终结者
转:http://www.cnblogs.com/chen1987lei/archive/2011/06/07/2074636.html ASIHTTPRequest是一款极其强劲的HTTP访问开源项 ...
- ASINetworkQueue 队列下载
我们通过一个例子介绍一下请求队列使用,我们设计了一个应用,用户点击GO按钮从服务器同时下载两张图片显示在画面中. 我们直接看看主视图控制器ViewController.h代码如下: #import “ ...
- OKDownload 下载框架 断点续传 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- ios 后台下载,断点续传总结
2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...
- WorldWind源码剖析系列:下载请求类DownloadRequest
下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadReques ...
- Android 多线程下载,断点续传,线程池
你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的 ...
- Android开发之多线程下载、断点续传、进度条和文本显示
代码实现了在Android环境下的多线程下载.断点续传.进度条显示和文本显示百分数: import java.io.BufferedReader; import java.io.File; impor ...
- Java开发之多线程下载和断点续传
代码实现了多线程下载和断点续传功能 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
随机推荐
- 秀才每天一篇之—SEO是什么?
[导读]SEO是什么?秀才搁笔七天以来.遇到非常多事情.站点被K ,排名掉了. 却找不出原因,開始迷茫了.以至于没有心情来照应这个博客,不好意思了,各位.在这七天以来.秀才一直在思考,SEO究竟应该怎 ...
- Java基础知识强化37:StringBuffer类之StringBuffer的构造方法
1. StringBuffer的构造方法: (1)StringBuffer(): (2)StringBuffer(CharSequence seq): (3)StringBuffer(int capa ...
- Mindset + Know-how+Concepture + Methodology+Technology
在做成都专案过程中深刻体会到一个IT全才应该具备Domain Know-how,拥有正确地理念是十分重要的, 我想只能是某几个领域,专案管理,专案运行中的各种手法,即Methodology,最后才是K ...
- htm初学笔记
一.什么是html HTML(HyperText Markup Language):超文本标记语言,一种纯文本类型的语言 --使用带有尖括号的“标记”将网页中的内容逐一标识出来 用来设计网页的标记语言 ...
- css快捷方式
本来是年前准备整理发布的,都搞定50%了,一篇万恶的<盗墓笔记:九幽将军>让我猪油蒙了心.....诶,不说了,搞一半就算了,最后还忘了保存,此刻只听得那一万只草某马呼啸而过... 言归正传 ...
- "sfc/scannow" 修复系统,提示 "windows资源保护无法启动修复服务"(win7)
原因: ArcGIS9.3安装后对注册空间进行了限制. 解决方案: 1,输入 regeidt 打开注册表. 2,找到 HKEY_LOCAL_MACHINE\System\CurrentControlS ...
- SQL存储过程笔记
一.概述 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 优点: ...
- java开发软件的安装
jdk+eclipse+svn+maven+mysql+tomcat7.0+sublime安装包和jar插件 配置管理工具-SVN http://download.csdn.net/detail/u0 ...
- string的一些操作,类似数组
1.串的切割 var a="hello world";//a.length=11 alert(a.slice(3)); alert(a.substring(3)); alert(a ...
- 从零开始制作Minecraft启动器(C++开源)
从零开始制作Minecraft启动器(C++开源) 新手飙车了~~~,MC启动器源码大放送,随心所欲打造自己的专属MC启动器,这不是易语言,是C++...分析原理,关键源码都有详细的注释,代码编好就打 ...