ASIHTTPRequest学习(三)
刚刚开始学习ASIHttpRequest,今天通过自己写的一个小demo分享一下学习心得。
首先,要想在ios项目中使用ASIHttpRequest,必须添加下列框架和类库:
- ASIHttpRequest
- CFNetwork.framework
- SystemConfiguration.framework
- MobileCoreServices.framework
- CoreGraphics.framework
- libz.dylib
下面是我们今天要完成的任务:
- 下载指定链接的zip压缩文件
- 存放在Documents目录下
- 支持断点续传
- 显示下载进度
- 解压到指定目录
那就开始吧,首先我们要创建一个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,继续:
为了使用解压缩,我引用了第三方类库:
解压缩的代码如下:
- (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!解压成功,现在应该可以看到解压后的文件了:
大功告成!!!
现在回头看看一开始的任务:
- 下载指定链接的zip压缩文件
- 存放在Documents目录下
- 支持断点续传
- 显示下载进度
- 解压到指定目录
没错都完成了!下面是我的项目文件,里面添加了删除和阅读功能:
参考:
- http://www.dreamingwish.com/dream-2011/powerful-asihttprequest-library-two.html
- http://www.cocoachina.com/bbs/read.php?tid=61709&keyword=ASIHttpRequest
第一次这么正经的写博客,很不习惯,以后尽量多写,谢谢观看!!!
ASIHTTPRequest学习(三)的更多相关文章
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- TweenMax动画库学习(三)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化
1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点
深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...
- SVG 学习<三>渐变
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
随机推荐
- ESLint 代码检查规范
目录 Airbnb Javascript Style Guide 引用 对象 数组 函数 箭头函数 类和构造器 模块 Iterators and Generators 变量 比较运算符 注释 空格 A ...
- htmlagilitypack解析html
这是个很好的的东西,以前做Html解析都是在用htmlparser,用的虽然顺手,但解析速度较慢,碰巧今天找到了这个,就拿过来试,一切出乎意料,非常爽,推荐给各位使用. 下面是一些简单的使用技巧,希望 ...
- SVN基本介绍
SVN是一种项目合作开发的软件,参与项目的人员可以在不同的地方实现文件和目录的超时空共享. 两个重要的概念: 1.配置库(Repository) SVN的核心是配置库,储存所有的数据,配置库按照文件树 ...
- hadoop2.6.4【ubuntu】单机环境搭建 系列1
jdk安装 tar zxvf jdk mv jdk /usr/lib/jvm/java jdk环境变量配置 vim /etc/profile ``` export JAVA_HOME=/usr/lib ...
- Java API操作ZooKeeper
创建会话 package org.zln.zk; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watch ...
- 网络战争 [KD-Tree+最小割树]
题面 思路 首先吐槽一下: 这题是什么东西啊??出题人啊,故意拼题很有意思吗??还拼两个这么毒瘤的东西???? 10K代码了解一下???? 然后是正经东西 首先,本题可以理解为这样: 给定$n$个块, ...
- 获取地址栏参数 - queryString(正则表达式版本)
获取所有query string function queryStringAll() { var reg = /(?:^|&)([^&]+)=([^&]+)(?=&|$ ...
- Waifu2x测试
真的是好玩..给大家(?)提供一个能用Waifu2x upscale的图片类型集合.. 上面是原图下面是Upscaled..因为是png大家自行下载对比..
- python tornado对接权限中心的sdk封装
# -*- coding: utf-8 -*- import json import requests import logging as logger from python.akskapp.scr ...
- python列表里的字典元素去重
去重 def list_dict_duplicate_removal(): data_list = [{"a": "123", "b": & ...