[iOS 多线程 & 网络 - 2.9] - ASI框架

A.ASI基本知识

1.ASI简单介绍

ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大。

ASI的实现基于底层的CFNetwork框架,因此运行效率很高。

ASI的github地址

https://github.com/pokeb/asi-http-request

ASI的使用参考
http://www.cnblogs.com/dotey/archive/2011/05/10/2041966.html

http://www.oschina.net/question/54100_36184

2.ASI的使用

(1)导入

  下载并导入ASI框架,注意该框架依赖于Reachability.

(2)ASI的源码需要设置为非ARC编译:

ASI依赖框架:

B.基本使用

创建请求对象 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

1.发送GET & POST请求

(1)GET请求

 1 /** get请求 */
 2 - (void)sendByGet{
 3     // 创建请求
 4     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"];
 5     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 6
 7     // 设置请求
 8     request.timeOutSeconds = 10; // 超时时间
 9     request.delegate = self;
10
11     // 使用selector处理请求返回数据
12     [request setDidStartSelector:@selector(startRequest)];
13
14     // 发送请求
15     [request startSynchronous]; // 同步请求
16 }
17
18 /** 请求开始 */
19 - (void) startRequest
20     NSLog(@"请求开始")
21 }

(2)POST请求

a.设置请求方法

request.requestMethod = @"POST";

b.设置请求体,设置请求内容

[request setPostValue]

方法1:

 1 #pragma mark - POST
 2 - (void) sendByPost {
 3     // 创建请求
 4     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login"];
 5     self.request = [ASIHTTPRequest requestWithURL:url];
 6
 7     // 设置请求方法
 8     self.request.requestMethod = @"POST";
 9
10     // 设置请求体
11     [self.request appendPostData:[@"name=tom&password=123" dataUsingEncoding:NSUTF8StringEncoding]];
12 //    [self.request setPostLength:self.request.postBody.length];
13 //    [self.request addRequestHeader:[NSString stringWithFormat:@"%d", self.request.postBody.length] value:@"Content-Length"];
14 //    [self.request addRequestHeader:@"application/x-www-form-urlencoded" value:@"Content-Type"];
15
16     self.request.completionBlock = ^ {
17         NSLog(@"请求完毕");
18     };
19      // 发送请求
20     [self.request startAsynchronous];
21 }

#mark:此项失败!服务器没有收到数据!建议使用方法2

方法2:使用ASIFormDataRequest

 1 - (void) sendByPost2 {
 2     // 创建请求
 3     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login"];
 4     self.formRequest = [ASIFormDataRequest requestWithURL:url];
 5
 6     // 添加请求参数
 7     [self.formRequest addPostValue:@"tom" forKey:@"user"];
 8     [self.formRequest addPostValue:@"123" forKey:@"password"];
 9
10     self.formRequest.completionBlock = ^ {
11         NSLog(@"请求完毕");
12     };
13
14     // 发送请求
15     [self.formRequest startAsynchronous];
16 }

注意add和set的区别,一个是添加(适用于多值参数),一个是覆盖(内部先remove,再add)。

2.发送同步 & 异步请求

(1)发送同步请求

[request sendSynchronous];

(2)发送异步请求

[request sendAsynchronous];

1     // 发送请求
2     [request startSynchronous]; // 同步请求
3 //    [request startAsynchronous]; // 异步请求

3.处理返回信息

(1)request属性

  • request.error
  • request.responseStatusCode
  • request.responseStatusMessage
  • request.responseData
  • request.responseString

发送请求后:

1     if (request.error) {
2         NSLog(@"请求出错");
3     }

(2)使用代理

遵守 <ASIHTTPRequestDelegate>

 1 /** get请求 */
 2 - (void)sendByGet{
 3     // 创建请求
 4     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"];
 5     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 6
 7     // 设置请求
 8     request.delegate = self;
 9     // 发送请求
10     [request startAsynchronous]; // 异步请求
11 }
12
13 #pragma mark - ASIHTTPRequestDelegate
14 /** 使用代理处理请求事件 */
15 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
16     NSLog(@"正在接受数据");
17 }
18  

(3)使用selector(基于代理方法,会覆盖代理方法)

====>此方法也要设置代理

 1 /** get请求 */
 2 - (void)sendByGet{
 3     // 创建请求
 4     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"];
 5     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 6
 7     // 设置请求
 8     request.delegate = self;
 9
10     // 使用selector处理请求事件
11     [request setDidStartSelector:@selector(startRequest)];
12     // 发送请求
13     [request startAsynchronous]; // 异步请求
14 }
15
16 /** 请求开始 */
17 - (void) startRequest {
18     NSLog(@"请求开始");
19 }

(4)使用block

开启block:[request setStartedBlock:(void ^block)];

接收数据block:[request setDataReceive:(void ^block)];

结束block:[request setCompletionBlock:(void ^block)];

 1 /** get请求 */
 2 - (void)sendByGet{
 3     // 创建请求
 4     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"];
 5     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 6
 7     // 设置请求
 8     request.timeOutSeconds = 10; // 超时时间
 9     request.delegate = self;
10
11     // 使用block处理请求事件
12     [request setCompletionBlock:^{
13         NSLog(@"请求完成!");
14     }];
15
16     // 发送请求
17     [request startAsynchronous]; // 异步请求
18 }

4.其实,需要把request作为成员变量,控制器被销毁,切记要先取消、清除request

====> 否则request的response返回的时候会发生野指针错误

 1 @interface ViewController () <ASIHTTPRequestDelegate>
 2 @property(nonatomic, strong) ASIHTTPRequest *request;
 3 @end
 4
 5 #pragma mark - dealloc
 6 /** 控制器销毁之前,一定要取消、清除成员request代理 */
 7 - (void)dealloc {
 8     [self.request clearDelegatesAndCancel];
 9     self.request = nil;
10 }

C.其他用法

1.ASIFormDataRequest继承NSOperation,可以放到queue中管理

2.网络请求状态

3.显示网络请求状态(状态栏指示动画圈)

4.支持后台网络请求

5.设置请求超时重试次数

时间: 2024-10-23 13:28:18

[iOS 多线程 & 网络 - 2.9] - ASI框架的相关文章

[iOS 多线程 &amp; 网络 - 2.10] - ASI框架下载文件

A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的网络请求(异步).按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间. ASI框架是基于底层的cfnoteworking的,性能很好.当然也可以设置block,或者是监听下载的进度. 自动会使用“边下边写” 使用进度

[iOS 多线程 &amp; 网络 - 2.11] - ASI框架上传文件

A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求 2.上传相册相片 UIImagePickerController用来选择图片 设置图片来源,可以选择相册 使用代理 UIImagePickerControllerDelegate方法,选择完成之后取得相片 1 // 2 // ViewController.m 3 // ASIUploadDemo 4 // 5 // Created by hellovoid

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

原文  http://www.cnblogs.com/wendingding/p/3961681.html iOS开发网络篇—使用ASI框架进行文件下载 说明 :本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYViewController.h" 2 #import "ASIHTTPRequest.h" 3 4 @interface YYViewController () 5 6 7 @

iOS 多线程 &amp; 网络 - 4.0 - AFN框架简单使用

A.AFN基本知识 1.概念 AFNetworking 是对NSURLConnection的封装 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单 AFN支持ARC B.基本请求使用 1.基本使用 (1)头文件 AFNetworking.h (2)管理者类:AFHTTPRequestOperationManager (3)“GET”方法发送GET请求,使用“POST”方法发送POST请求 (4)使用字典发送参数 (5)block处理请求成功/失败 1 /** 发送 GET/

[iOS 多线程 &amp; 网络 - 2.0] - 发送接收 服务器信息

A.搭建java服务器 使用eclipse.tomcat和struts2框架搭建一个简单的服务器 1.准备好合适版本的JDK.eclipse EE.tomcat.struts2 框架包 2.配置JDK和tomcat系统变量 3.在eclipse中创建一个Dynamic Web Project, 勾选创建web.xml 4.解压一个struts2中的app范例,参考其中的web.xml和struts.xml配置 5.配置tomcat,注意配置正确的服务器的路径和发布路径,不要使用默认的eclips

[iOS 多线程 &amp; 网络 - 1.0] - 多线程概述

A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程 B.线程 主线程.子线程占用内存分别是1M和512K 1.什么是线程1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中

猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil

[iOS 多线程 &amp; 网络 - 2.8] - 检测网络状态

A.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的:(1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能)(2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验 WIFI\3G网络:自动下载高清图片 低速网络:只下载缩略图 没有网络:只显示离线的缓存数据 苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态https://developer.apple.com/library/ios/samplecode/Reachability

[iOS 多线程 &amp; 网络 - 2.1] - 解析json

A.iOS中json的基本使用 1.解析json数据 (1)json反序列化 对象{}格式 {key : value, key : value,...} 的键值对的结构可以反序列化为OC中的NSDictionary数组[]格式 ["java","javascript","vb",...]可以反序列化为OC中的NSArray 提示JSON的数据格式与OC中的快速包装方法非常类似JSON的数据格式同样支持嵌套 (2)json工具 从iOS 5开始,使