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

简介:

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

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

一、简单介绍

代码示例:

复制代码
 1 #import "YYViewController.h"
 2 #import "ASIHTTPRequest.h"
 3 
 4 @interface YYViewController ()
 5 
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
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)download
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     [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 YYViewController
10 
11 - (void)viewDidLoad
12 {
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)download
25 {    //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)download1
40 {
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 ()<ASIProgressDelegate>
 5 @property (weak, nonatomic) IBOutlet UIProgressView *progress;
 6 @end
 7 
 8 @implementation YYViewController
 9 
10 - (void)viewDidLoad
11 {
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)download
23 {
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 ()<ASIProgressDelegate>
 6 
 7 @property (weak, nonatomic) IBOutlet DACircularProgressView *circularView;
 8 @property (weak, nonatomic) IBOutlet UIProgressView *progress;
 9 @end
10 
11 @implementation YYViewController
12 
13 - (void)viewDidLoad
14 {
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)download
30 {
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
复制代码

显示效果:

特别提示:

标签:  IOS开发网络篇
目录
相关文章
|
9天前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
128 60
|
4天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
112 1
|
11天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
32 9
|
7天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
11天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
9天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
12天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
16天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第31天】在这篇文章中,我们将一起踏上iOS开发的旅程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从基础开始,逐步深入到更高级的技术和概念。让我们一起探索iOS开发的世界吧!
|
19天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第28天】在这篇技术性文章中,我们将一起踏上一段探索iOS开发的旅程。无论你是刚入门的新手,还是希望提升技能的开发者,这篇文章都将为你提供宝贵的指导和灵感。我们将从基础概念开始,逐步深入到高级主题,如设计模式、性能优化等。通过阅读这篇文章,你将获得一个清晰的学习路径,帮助你在iOS开发领域不断成长。
50 2