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
复制代码

显示效果:

特别提示:

目录
相关文章
|
2月前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
221 60
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
25天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
118 66
|
25天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
53 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
11天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
2月前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
67 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
108 3
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
2月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!