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];

}

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

  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,继续:

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

  • 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

转载于:https://www.cnblogs.com/snake-hand/p/3170507.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

熊仔科技Steamduino PIC18F46J50主控板 部分原理图

目录连接情况原理图实物图Proteus 8 Frofessional v8.9 SP2 从学长那嫖的,本来貌似是要用来做写字机器人的,后面学长换成Arduino UNO了。 网上找不到资料,用万用表简单测了测没有丝印部分的连接情况 连接情况 RD2/PMD2/RP19 USR_LED…

【51单片机快速入门指南】3.3:USART 串口通信

目录快速使用硬知识串行口相关寄存器串行口控制寄存器SCON和PCON串行口数据缓冲寄存器SBUF从机地址控制寄存器SADEN和SADDR与串行口中断相关的寄存器IE和IPH、IP串行口工作模式串行口工作模式0:同步移位寄存器串行口工作模式1:8位UART,波特率…

Spring JTA应用JOTM Atomikos II JOTM

上节建立了一个简单的Java Application以及所需要的数据库和数据表,本节将介绍JOTM在Spring中的配置。 JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分&…

从包中构建瓦片服务器

SWITCH2OSM 切换到OPENSTREETMAP 丰富的数据 OpenStreetMap数据丰富而详细,包含与实地人相关的大量数据 - 收集的数据。 功能包括: 道路,铁路,水路等餐厅,商店,车站,自动取款机等。步行和自行车…

【51单片机快速入门指南】4: 软件 I2C

目录硬知识I2C 介绍I2C 物理层I2C 协议层数据有效性规定起始和停止信号应答响应总线的寻址方式数据传输示例程序Soft_I2C.cSoft_I2C.h普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《普中 51 单片机开发攻略》 I2…

【51单片机快速入门指南】4.1: I2C 与 AT24C02 (EEPROM) 的跨页连续读写

目录硬知识AT24Cxx 介绍引脚排列引脚说明存储结构器件寻址器件操作待机模式存储复位写操作字节写页写应答查询读操作当前地址读随机读顺序读示例程序24C02.c24C02.h测试程序main.c实验现象通讯波形写入部分读取部分普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof…

iOS Application Security

文章分A,B,C,D 4个部分。 A) iOS Application Security 下面介绍iOS应用安全,如何分析和动态修改app。 1)iOS Application security Part 1 – Setting up a mobile pentesting platform Part1介绍如何在越狱的设备上搭建用来测试iOS安全的环境。 2&…

【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解

目录硬知识SSD1306简介I2C 接口从机地址位(SA0)I2C 总线写数据命令解码器晶振电路和显示时间发生器复位图形显示数据RAM (GDDRAM)命令表基本命令表部分指令详解为 BANK0 设置对比度控制(81h)全部显示开启(A4h/A5h&…

使用GNS3和Cisco IOU搭建路由交换实验-安装篇

如何使用GNS3和Cisco IOU搭建路由交换实验-安装篇GNS3软件的安装建议大家从官网直接下载最新版本的GNS3,官网连接http://www.gns3.com/根据系统类型选择相应的版本,这里我选择的是Windwos系统的最新版本1.3.2下载好安装包后直接运行安装包,在…

1787: [Ahoi2008]Meet 紧急集合

1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1482 Solved: 652[Submit][Status][Discuss]Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 6 6 6 Sample Output 5 2 2 5 4 1 6 0 HINT Sou…

一步一步学Vue(四)

接上篇。上篇中给出了代码框架,没有具体实现,这一篇会对上篇定义的几个组件进行分别介绍和完善: 1、TodoContainer组件 TodoContainer组件,用来组织其它组件,这是react中推荐的方式,也是redux中高阶组件一般…

【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据

目录硬知识特性参数MPU6050 简介模块重要寄存器简介电源管理寄存器 1陀螺仪配置寄存器加速度传感器配置寄存器FIFO 使能寄存器陀螺仪采样率分频寄存器配置寄存器电源管理寄存器 2陀螺仪数据输出寄存器加速度传感器数据输出寄存器温度传感器示例程序MPU6050.cMPU6050.hmain.c实验…

OSM数据的获取及格式转换

转自 :http://blog.sina.com.cn/s/blog_72f0b6080102w39z.html 前言:本篇博文将介绍如何对OSM数据进行获取,以及格式的转换(转为shapefile格式)。以供OSM数据获取失败、OSM editor操作失败的朋友参考。由于并不是多么高…

再读TCP/IP网络7层协议

随着工作的深入,每次读这7层协议,每次都有不同的理解。 分层名 分层号 描述 比喻 应用层Application La…

oracle复习笔记

2019独角兽企业重金招聘Python工程师标准>>> 1.oracle相关认证:OCA:Oracle认证专员,OCP:Oracle专家认证,OCM:Oracle认证大师。 2.1979年,Oracle2发布。 3.Oracle数据库特点:支持多用户,大事务量的事务处理&…

【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角

目录相关介绍DMP库相关DMP加载步骤:DMP设置数据写入更新DMPDMP数据包结构程序实现DMP.cDMP.h测试程序四元数实验现象欧拉角的获取普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机:Vofa 1.3.10 相关…

cardsui-for-android

https://github.com/Androguide/cardsui-for-android cardsui-for-android-master.zip

spoj 2 Prime Generator

题目&#xff1a;Prime Generator 思路&#xff1a;分段筛素数 #include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> #include <map> using namespace std; #define maxn 40000 int n_prime…

LTDC/DMA2D—液晶显示

本章参考资料&#xff1a;《STM32F4xx 参考手册 2》、《STM32F4xx 规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于开发板配套的液晶屏参数可查阅《5.0 寸液晶屏数据手册》配套资料获知。 显示器简介显示器属于计算机的 I/O 设备&#xff0c;即输入输出设备…

【51单片机快速入门指南】4.3.2: MPU6050:一阶互补滤波、二阶互补滤波和卡尔曼滤波获取欧拉角

目录源码MPU6050_Filter.cMPU6050_Filter.h使用方法测试程序一阶互补滤波效果二阶互补滤波效果卡尔曼滤波效果总结普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 参考资料&#xff1a; MPU6050…