iOS开发之ASI

2023-12-13 17:58
文章标签 开发 ios asi

本文主要是介绍iOS开发之ASI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文将继续讲解网络编程,我们将使用第三方框架来实现网络编程。主要介绍两个框架:ASI 、AFN。本文主要介绍ASI。

利用ASI发送一个网络请求:同步请求、异步请求。需要向项目中导入库文件,如下:


同步请求

/***  同步请求*/
- (void)ASIsyncho {// 获取网络资源路径NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];// 创建请求//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];// 设置请求超时request.timeOutSeconds = 10;// 发送请求(同步)[request startSynchronous];// 该行代码过掉,才会执行下面代码// 对返回数据,进行处理NSError *error = [request error];if (error) {NSLog(@"请求出错---%@", error);}else {// 请求成功// 获取数据NSData *data = [request responseData];// 网络数据NSLog(@"data - %zd", data.length);int status = [request responseStatusCode];// 状态码:200 OKNSLog(@"status - %d", status);}}

运行结果:

如果网络速度很慢或请求数据很大,程序将会卡在[requeststartSynchronous];

这一行,给用户不好的体验,我们基本上不使用同步的请求。

异步请求:代理方法、SEL回调、block回调

1.    代理方法

/***  异步请求(代理)*/
- (void)ASIasynchoDelegate {// 获取网络资源路径NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];// 创建请求//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];self.request = [ASIHTTPRequest requestWithURL:url];// 设置请求超时self.request.timeOutSeconds = 10;// 设置代理,遵循ASIHTTPRequestDelegate协议self.request.delegate = self;// ASIHTTPRequestDelegate// 发送异步请求,ASI通过代理的方式处理异步请求,请求成功、失败都会通知代理[self.request startAsynchronous];
}#pragma mark - ASIHTTPRequestDelegate
/***  请求开始时调用*/
- (void)requestStarted:(ASIHTTPRequest *)request {NSLog(@"requestStarted----");
}/***  请求成功结束时调用*/
- (void)requestFinished:(ASIHTTPRequest *)request {NSLog(@"requestFinished----");
}/***  请求出错时调用*/
- (void)requestFailed:(ASIHTTPRequest *)request {NSLog(@"requestFailed----");
}/***  有数据返回时调用*/
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {NSLog(@"didReceiveData---- %zd", data.length);
}

注意:应当在控制器被销毁的时候,取消请求,如下:

- (void)dealloc {[self.request clearDelegatesAndCancel];self.request = nil;
}

运行结果:

可见协议方法request:didReceiveData:被调用的很频繁,和之前讲过的NSURLConnection很相似。

2.    SEL回调

/***  异步请求(SEL回调方法)*/
- (void)ASIasynchoSEL {// 获取网络资源路径NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];// 创建请求//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];self.request = [ASIHTTPRequest requestWithURL:url];// 设置请求超时self.request.timeOutSeconds = 10;[self.request setDelegate:self];// 还需要设置代理// 请求成功、失败都会回调相应的方法// 请求开始回调[self.request setDidStartSelector:@selector(asynchoRequestStarted)];// 请求失败回调[self.request setDidFailSelector:@selector(asynchoRequestFailed)];// 请求成功结束回调[self.request setDidFinishSelector:@selector(asynchoRequestFinished)];// 接受到请求头回调[self.request setDidReceiveResponseHeadersSelector:@selector(asynchoRequestHeader)];// 发送异步请求[self.request startAsynchronous];
}- (void)asynchoRequestStarted {NSLog(@"asynchoRequestStarted--");
}
- (void)asynchoRequestFailed {NSLog(@"asynchoRequestFailed--");
}
- (void)asynchoRequestFinished {NSLog(@"asynchoRequestFinished--");
}
- (void)asynchoRequestHeader {NSLog(@"-----%@", self.request.responseHeaders);}
注意:上面的代理中也设置的ASIHTTPRequest对象的代理,所以也要再控制器销毁的时候,取消请求,如下:

- (void)dealloc {[self.request clearDelegatesAndCancel];self.request = nil;
}

运行结果:


3.    block回调

/***  异步请求(block回调方法)*/
- (void)ASIasynchoBlock {// 获取网络资源路径NSURL *url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/Collfiles/20140831/2014083109364172.gif"];// 创建请求//    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:<#(NSURL *)#>];self.request = [ASIHTTPRequest requestWithURL:url];// 设置请求超时self.request.timeOutSeconds = 10;__weak typeof(self) weakSelf = self;// 请求出错[self.request setStartedBlock:^{NSLog(@"setStartedBlock---");}];// 请求出错[self.request setFailedBlock:^{NSLog(@"setFailedBlock---");}];// 请求成功完成[self.request setCompletionBlock:^{NSLog(@"setCompletionBlock---");NSData *responseData = [weakSelf.request responseData];NSLog(@"数据--- %zd", responseData.length);}];[self.request setBytesReceivedBlock:^(unsigned long long size, unsigned long long total) {NSLog(@"setBytesReceivedBlock---size = %lld", size);}];[self.request startAsynchronous];
}

运行结果:


以上发送同步请求和异步请求都属于GET请求。还有一个小细节,发送请求后,会自动带有加载视图出现,如下:

利用ASI发送请求,我们可以获得服务器的各种响应,如下:

// 获得状态码、状态信息
@property (atomic, assign,readonly) int responseStatusCode;
@property (atomic, retain,readonly) NSString *responseStatusMessage;// 获得响应头
@property (atomic, retain) NSDictionary *responseHeaders;// 获得实体内容(响应体)
- (NSData *)responseData;
- (NSString *)responseString;

下面介绍一下利用ASI发送POST请求。需要包含ASIFormDataRequest.h头文件。下面简单使用一下:

- (void)ASIPOST {NSURL *url = [NSURL URLWithString:@""];// 创建请求ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];// 设置请求体(请求参数)形如:username=shx&pwd=123456[request setPostValue:@"shx" forKey:@"username"];[request setPostValue:@"123456" forKey:@"pwd"];// 发送POST请求
//    [request startSynchronous];// 同步[request startAsynchronous];// 异步//输入返回的信息NSLog(@"response\n%@",[request responseString]);
}

下面介绍一下利用ASI进行文件下载操作,ASI进行文件下载,只需要设置文件存储路径即可。如下:

/***  文件下载*/
- (void)fileDownLoad {// 得到文件下载路径NSURL *url = [NSURL URLWithString:@"http://..."];ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];// 文件存储路径(将文件存储在什么地方)NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];NSString *filePath = [path stringByAppendingPathComponent:@"abc.zip"];// 设置文件存储路径request.downloadDestinationPath = filePath;// 设置下载代理,遵循ASIProgressDelegate协议(其实只要实现了setProgress:方法,都可以成为它的代理对象,如:UIProgressView对象)request.downloadProgressDelegate = self;// 还可以设置是否支持断点下载request.allowResumeForFileDownloads = YES;// 发送请求,下载[request startAsynchronous];
}
#pragma mark 进度代理方法
- (void)setProgress:(float)newProgress
{NSLog(@"-----%f", newProgress);
}

下面是简单的文件上传功能的实现,,如下:

/***  文件上传*/
- (void)fileUpLoad {ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@""]];// 添加普通参数[request setPostValue:@"shx" forKey:@"user"];// 添加文件参数NSString *file = [[NSBundle mainBundle] pathForResource:@"1.png" ofType:nil];[request addFile:file forKey:@"file"];// 下面代码也可以上传1.png图片
//    UIImage *image = [UIImage imageNamed:@"1.png"];
//    NSData *data = UIImagePNGRepresentation(image);
//    [request addData:data withFileName:@"test.png" andContentType:@"image/png" forKey:@"file"];// test.png是存储到本地时候的图片名// 发送请求,上传[request startAsynchronous];
}
2 种添加文件参数的方法
// 通过文件的全路径
- (void)addFile:(NSString *)filePath forKey:(NSString *)key
- (void)addFile:(NSString *)filePath withFileName:(NSString *)fileName andContentType:(NSString *)contentType forKey:(NSString *)key// 通过文件的具体数据
- (void)addData:(id)data withFileName:(NSString *)fileName andContentType:(NSString *)contentType forKey:(NSString *)key

关于ASI网络编程注意点:

实际上ASIHTTPRequest继承自NSOperation,意味着

可以将多个ASIHTTPRequest放到NSOperationQueue中,同时管理多个请求

可以设置请求之间的依赖

… …

ASIFormDataRequest继承自ASIHTTPRequest

其他的一些用法

// 现在是否有网络请求在处理中
[ASIHTTPRequest isNetworkInUse];// 当正在请求时,是否要在状态栏显示联网状态(转圈圈)
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];// 当应用后台运行时,是否仍然继续处理网络请求
request.shouldContinueWhenAppEntersBackground = YES;// 设置请求超时后重试的次数
request.numberOfTimesToRetryOnTimeout = 2; // 重试2次

ASI还提供了缓存功能。ASI只能缓存Get请求的响应数据。关于ASI的缓存策略这里不做介绍。

这篇关于iOS开发之ASI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489387

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件