博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发网络篇—使用ASI框架进行文件下载
阅读量:6047 次
发布时间:2019-06-20

本文共 5468 字,大约阅读时间需要 18 分钟。

iOS开发网络篇—使用ASI框架进行文件下载

说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载。

一、简单介绍

代码示例:

复制代码
1 #import "YYViewController.h"  2 #import "ASIHTTPRequest.h"  3  4 @interface YYViewController () 5  6  7 @end  8  9 @implementation YYViewController10 11 - (void)viewDidLoad12 {13  [super viewDidLoad];14 }15 16 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 17 {18 //下载服务器上的文件 19  [self download];20 }21 22 #pragma mark-下载文件23 -(void)download24 { //1.创建请求对象 25 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];26 ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];27 28 //2.添加请求参数(请求体中的参数) 29 [request setDataReceivedBlock:^(NSData *data) {30 NSLog(@"%d",data.length);31  }];32 33 //3.异步发送网络请求 34  [request startAsynchronous];35 }36 37 @end
复制代码

代码说明:上面的代码从服务器上异步下载文件,每当接收到数据的时候就打印接收到的数据的长度。

打印结果如下:

注意:在实际的开发中不能这样去下载文件,因为他不断的拼接文件数据的操作是在内存中进行的,如果所下载文件的数据较大,那么将会直接导致内存爆掉。

二、实际开发中的使用

代码示例(演示2):

复制代码
1 #import "YYViewController.h"  2 #import "ASIHTTPRequest.h"  3  4 @interface YYViewController () 5  6  7 @end  8  9 @implementation YYViewController10 11 - (void)viewDidLoad12 {13  [super viewDidLoad];14 }15 16 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 17 {18 //下载服务器上的文件 19  [self download1];20 }21 22 #pragma mark-下载文件23 //演示1 24 -(void)download25 { //1.创建请求对象 26 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];27 ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];28 29 //2.添加请求参数(请求体中的参数) 30 [request setDataReceivedBlock:^(NSData *data) {31 NSLog(@"%d",data.length);32  }];33 34 //3.异步发送网络请求 35  [request startAsynchronous];36 }37 38 //演示2 39 -(void)download140 {41 //1.创建请求对象 42 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];43 ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];44 45 //2.设置下载文件保存的路径 46 NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];47 NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];48 request.downloadDestinationPath=filename;49 NSLog(@"%@",filename);50 51 //3.发送网络请求(异步) 52  [request startAsynchronous];53 54 //4.当下载完成后通知 55 [request setCompletionBlock:^{56 NSLog(@"下载成功");57  }];58 }59 60 @end
复制代码

下载成功:

代码说明:

在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可(参照上面的代码)。

(1)创建请求对象;

(2)设置下载文件保存的路径;

(3)发送下载文件的网络请求(异步)。

按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间。

asi框架是基于底层的cfnoteworking的,性能很好。当然也可以设置block,或者是监听下载的进度。

下面介绍使用asi框架下载文件,如何监听下载的进度。

设置下载代理,注意不是控制器代理。

代码示例:

复制代码
1 #import "YYViewController.h"  2 #import "ASIHTTPRequest.h"  3  4 @interface YYViewController ()
5 @property (weak, nonatomic) IBOutlet UIProgressView *progress; 6 @end 7 8 @implementation YYViewController 9 10 - (void)viewDidLoad11 {12 [super viewDidLoad];13 }14 15 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 16 {17 //下载服务器上的文件 18 [self download];19 }20 21 #pragma mark-下载文件22 -(void)download23 {24 //1.创建请求对象 25 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];26 ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];27 28 //2.设置下载文件保存的路径 29 NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];30 NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];31 request.downloadDestinationPath=filename;32 NSLog(@"%@",filename);33 34 //3.设置下载进度的代理 35 request.downloadProgressDelegate=self.progress;36 37 //4.发送网络请求(异步) 38 [request startAsynchronous];39 40 //5.下载完毕后通知 41 [request setCompletionBlock:^{42 NSLog(@"文件已经下载完毕");43 }];44 }45 46 #pragma mark-监听下载进度的代理方法
复制代码

asi的文件下载还有一个属性可以设置是否支持断点下载。

设置支持断点下载的代码如下:

request.allowResumeForFileDownloads=YES;

这样的话,比如一个文件已经下载了百分之30到程序的沙盒中,这个时候取消了下载。当下一次点击下载文件的时候,会接着下载剩余的百分之70并一点一点的写入到沙盒中。

提示:取消下载的代码为:

[request clearDelegatesAndCancel];

三,结合一些进度显示的第三方框架使用

去code4app上面随便下载一个显示下载进度的第三方框架,这里以DACircularProgressView为例子。

导入该框架必要的文件后,简单使用如下。

代码示例:

复制代码
1 #import "YYViewController.h"  2 #import "ASIHTTPRequest.h"  3 #import "DACircularProgressView.h"  4  5 @interface YYViewController ()
6 7 @property (weak, nonatomic) IBOutlet DACircularProgressView *circularView; 8 @property (weak, nonatomic) IBOutlet UIProgressView *progress; 9 @end 10 11 @implementation YYViewController12 13 - (void)viewDidLoad14 {15 [super viewDidLoad];16 17 //设置基本的一些属性 18 self.circularView.trackTintColor=[UIColor lightGrayColor];19 self.circularView.progressTintColor=[UIColor yellowColor];20 }21 22 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 23 {24 //下载服务器上的文件 25 [self download];26 }27 28 #pragma mark-下载文件29 -(void)download30 {31 //1.创建请求对象 32 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];33 ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];34 35 //2.设置下载文件保存的路径 36 NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];37 NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];38 request.downloadDestinationPath=filename;39 NSLog(@"%@",filename);40 41 //3.设置下载进度的代理 42 request.downloadProgressDelegate=self.circularView;43 44 //4.发送网络请求(异步) 45 [request startAsynchronous];46 47 //5.设置支持断点下载 48 request.allowResumeForFileDownloads=YES;49 50 //5.下载完毕后通知 51 [request setCompletionBlock:^{52 NSLog(@"文件已经下载完毕");53 }];54 }55 56 #pragma mark-监听下载进度的代理方法57 @end
复制代码

显示效果:

特别提示:

转载地址:http://vhaex.baihongyu.com/

你可能感兴趣的文章
docker网络
查看>>
防范勒索病毒及关闭相关端口
查看>>
Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台
查看>>
linux下安装node-sass报错
查看>>
Eclipse 下调试Tomcat6源码(转)
查看>>
js中几种实用的跨域方法原理详解
查看>>
金字塔原理(麦肯锡) 要点汇总
查看>>
常用的SQL语句
查看>>
外部程序启动App
查看>>
Rocket - diplomacy - enumerateMask
查看>>
老鼠试毒与位运算
查看>>
htmlparser实现从网页上抓取数据(收集)
查看>>
探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密(转载)
查看>>
PHP之高性能I/O框架:Libevent(三)
查看>>
n阶皇后问题
查看>>
git版本控制的使用
查看>>
Linux中Matlab安装总结
查看>>
初识Vivado
查看>>
一个5位数,判断它是不是回文数
查看>>
[NOIP2011] 观光公交
查看>>