iOS开发网络篇—使用ASI框架进行文件下载
iOS开发网络篇—使用ASI框架进行文件下载
说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载。
一、简单介绍
代码示例:
#import "YYViewController.h" #import "ASIHTTPRequest.h" @interface YYViewController () @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //下载服务器上的文件 [self download]; } #pragma mark-下载文件 -(void)download { //1.创建请求对象 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url]; //2.添加请求参数(请求体中的参数) [request setDataReceivedBlock:^(NSData *data) { NSLog(@"%d",data.length); }]; //3.异步发送网络请求 [request startAsynchronous]; } @end
代码说明:上面的代码从服务器上异步下载文件,每当接收到数据的时候就打印接收到的数据的长度。
打印结果如下:
注意:在实际的开发中不能这样去下载文件,因为他不断的拼接文件数据的操作是在内存中进行的,如果所下载文件的数据较大,那么将会直接导致内存爆掉。
二、实际开发中的使用
代码示例(演示2):
#import "YYViewController.h" #import "ASIHTTPRequest.h" @interface YYViewController () @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //下载服务器上的文件 [self download1]; } #pragma mark-下载文件 //演示1 -(void)download { //1.创建请求对象 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url]; //2.添加请求参数(请求体中的参数) [request setDataReceivedBlock:^(NSData *data) { NSLog(@"%d",data.length); }]; //3.异步发送网络请求 [request startAsynchronous]; } //演示2 -(void)download1 { //1.创建请求对象 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url]; //2.设置下载文件保存的路径 NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"]; request.downloadDestinationPath=filename; NSLog(@"%@",filename); //3.发送网络请求(异步) [request startAsynchronous]; //4.当下载完成后通知 [request setCompletionBlock:^{ NSLog(@"下载成功"); }]; } @end
下载成功:
代码说明:
在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可(参照上面的代码)。
(1)创建请求对象;
(2)设置下载文件保存的路径;
(3)发送下载文件的网络请求(异步)。
按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间。
asi框架是基于底层的cfnoteworking的,性能很好。当然也可以设置block,或者是监听下载的进度。
下面介绍使用asi框架下载文件,如何监听下载的进度。
设置下载代理,注意不是控制器代理。
代码示例:
#import "YYViewController.h" #import "ASIHTTPRequest.h" @interface YYViewController ()<ASIProgressDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *progress; @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //下载服务器上的文件 [self download]; } #pragma mark-下载文件 -(void)download { //1.创建请求对象 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url]; //2.设置下载文件保存的路径 NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"]; request.downloadDestinationPath=filename; NSLog(@"%@",filename); //3.设置下载进度的代理 request.downloadProgressDelegate=self.progress; //4.发送网络请求(异步) [request startAsynchronous]; //5.下载完毕后通知 [request setCompletionBlock:^{ NSLog(@"文件已经下载完毕"); }]; } #pragma mark-监听下载进度的代理方法
asi的文件下载还有一个属性可以设置是否支持断点下载。
设置支持断点下载的代码如下:
request.allowResumeForFileDownloads=YES;
这样的话,比如一个文件已经下载了百分之30到程序的沙盒中,这个时候取消了下载。当下一次点击下载文件的时候,会接着下载剩余的百分之70并一点一点的写入到沙盒中。
提示:取消下载的代码为:
[request clearDelegatesAndCancel];
三,结合一些进度显示的第三方框架使用
去code4app上面随便下载一个显示下载进度的第三方框架,这里以DACircularProgressView为例子。
导入该框架必要的文件后,简单使用如下。
代码示例:
#import "YYViewController.h" #import "ASIHTTPRequest.h" #import "DACircularProgressView.h" @interface YYViewController ()<ASIProgressDelegate> @property (weak, nonatomic) IBOutlet DACircularProgressView *circularView; @property (weak, nonatomic) IBOutlet UIProgressView *progress; @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; //设置基本的一些属性 self.circularView.trackTintColor=[UIColor lightGrayColor]; self.circularView.progressTintColor=[UIColor yellowColor]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //下载服务器上的文件 [self download]; } #pragma mark-下载文件 -(void)download { //1.创建请求对象 NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url]; //2.设置下载文件保存的路径 NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"]; request.downloadDestinationPath=filename; NSLog(@"%@",filename); //3.设置下载进度的代理 request.downloadProgressDelegate=self.circularView; //4.发送网络请求(异步) [request startAsynchronous]; //5.设置支持断点下载 request.allowResumeForFileDownloads=YES; //5.下载完毕后通知 [request setCompletionBlock:^{ NSLog(@"文件已经下载完毕"); }]; } #pragma mark-监听下载进度的代理方法 @end
显示效果:
特别提示: