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

Posted 快乐加油站789

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

显示效果:

 

特别提示:

 

 

以上是关于iOS开发网络篇—使用ASI框架进行文件下载的主要内容,如果未能解决你的问题,请参考以下文章

iOS超全开源框架项目和学习资料汇总网络和Model篇

iOS开发之AFN的基本使用

iOS核心笔记——网络编程-ASI与AFN的区别

iOS 网络资源汇总之网络

iOS 网络资源汇总之网络

网络ASI