开发经验: 对AFN和ASI各自使用方法及区别的总结

经过多年的iOS开发, 现总结一下HTTP协议下的两大网络处理第三方框架的使用心得


首先来说下AFNetworking:

一、2大管理对象
1.AFHTTPRequestOperationManager
* 对NSURLConnection的封装

2.AFHTTPSessionManager
* 对NSURLSession的封装

二、AFHTTPRequestOperationManager的具体使用
1.创建管理者
AFHTTPRequestOperationManager \*mgr = [AFHTTPRequestOperationManager manager];

2.封装请求参数

NSMutableDictionary \*params = [NSMutableDictionary dictionary];
params[@"username"] = @"哈哈";
params[@"pwd"] = @"123";

3.发送请求

NSString *url = @"http://localhost:8080/LWServer/login";
[mgr POST:url parameters:params
  success:^(AFHTTPRequestOperation \*operation, id responseObject) {
      // 请求成功的时候调用这个block
      NSLog(@"请求成功---%@", responseObject);
  } failure:^(AFHTTPRequestOperation \*operation, NSError *error) {
      // 请求失败的时候调用调用这个block
      NSLog(@"请求失败");
  }];
// GET请求
[mgr GET:url parameters:params
  success:^(AFHTTPRequestOperation \*operation, id responseObject) {
      // 请求成功的时候调用这个block
      NSLog(@"请求成功---%@", responseObject);
  } failure:^(AFHTTPRequestOperation \*operation, NSError *error) {
      // 请求失败的时候调用调用这个block
      NSLog(@"请求失败");
  }];

三、对服务器返回数据的解析
1.AFN可以自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当做JSON来解析

2.设置对服务器返回数据的解析方式
1> 当做是JSON来解析(默认做法)
mgr.responseSerializer = [AFJSONResponseSerializer serializer];
responseObject的类型是NSDictionary或者NSArray

2> 当做是XML来解析
mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
responseObject的类型是NSXMLParser

3> 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

3.注意
* 服务器返回的数据一定要跟responseSerializer对得上
1> 服务器返回的是JSON数据
AFJSONResponseSerializer
AFHTTPResponseSerializer

2> 服务器返回的是XML数据
AFXMLParserResponseSerializer
AFHTTPResponseSerializer

3> 服务器返回的是其他数据
AFHTTPResponseSerializer


其次说下是asi-http-request:

一、发送请求的2个对象
1.发送GET请求:ASIHttpRequest

2.发送POST请求:ASIFormDataRequest
* 设置参数

// 同一个key只对应1个参数值,适用于普通“单值参数”
- (void)setPostValue:(id <NSObject>)value forKey:(NSString \*)key
// 同一个key(同一个参数名),会对应多个参数值,适用于“多值参数”
- (void)addPostValue:(id <NSObject>)value forKey:(NSString \*)key

二、发送请求
1.同步请求
startSynchronous

2.异步请求
startAsynchronous

三、监听请求的过程
1.如何监听请求过程
1> 为代理,遵守<ASIHTTPRequestDelegate>协议,实现协议中的代理方法

request.delegate = self;
- (void)requestStarted:(ASIHTTPRequest *)request;
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;

2> 成为代理,不遵守<ASIHTTPRequestDelegate>协议,自定义代理方法

request.delegate = self;
[request setDidStartSelector:@selector(start:)];
[request setDidFinishSelector:@selector(finish:)];

3> 设置block

[request setStartedBlock:^{
    NSLog(@"setStartedBlock");
}];
[request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) {
    NSLog(@"setHeadersReceivedBlock--%@", responseHeaders);
}];
[request setDataReceivedBlock:^(NSData *data) {
    NSLog(@"setDataReceivedBlock--%@", data);
}];
[request setCompletionBlock:^{
    NSLog(@"setCompletionBlock");
}];
[request setFailedBlock:^{
    NSLog(@"setFailedBlock");
}];

2.监听的使用注意
* 如果同时设置了block和实现了代理方法,请求过程中,block和代理方法都会调用
* 一般的调用顺序:代理方法 > block

3.如果实现了下面的代理方法,那么responseData\responseString就没有值

- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;

四、文件下载
1.一般的下载
1> 设置文件下载的保存路径

request.downloadDestinationPath = filepath;

2> 设置进度监听的代理(要想成为进度监听代理,最好遵守<ASIProgressDelegate>协议)

request.downloadProgressDelegate = self.progressView;

2.断点下载(断点续传)
1> 设置文件下载的临时路径

request.temporaryFileDownloadPath = tempFilepath;

2> 设置支持断点续传

request.allowResumeForFileDownloads = YES;

五、文件上传(设置文件参数)
1.如果知道文件路径,最好就用这个方法(因为简单)

// ASI内部会自动识别文件的MIMEType
[request setFile:file forKey:@"file"];
[request addFile:file forKey:@"file"];
[request setFile:file withFileName:@"basic.pptx" andContentType:@"application/vnd.openxmlformats-officedocument.presentationml.presentation" forKey:@"file"];
// .....

2.如果文件数据是动态产生的,就用这个方法(比如刚拍照完获得的图片数据)

[request setData:data withFileName:@"test.png" andContentType:@"image/png" forKey:@"file"];

六、ASIHttpRequest的常见用法
1.请求超时

@property (atomic, assign) NSTimeInterval timeOutSeconds;

2.获得错误信息

@property (atomic, retain) NSError *error;

3.获得响应数据

// 状态码
@property (atomic, assign,readonly) int responseStatusCode;
// 状态信息
@property (atomic, retain,readonly) NSString *responseStatusMessage;
// 服务器返回的具体数据(NSString格式)
- (NSString *)responseString;
// 服务器返回的具体数据(NSData格式)
- (NSData *)responseData;

最后是重点内容,也是面试时经常会问的问题,两者的区别:

一、底层实现
1> AFN的底层基于OC的NSURLConnectionNSURLSession
2> ASI的底层基于纯C语言的CFNetwork框架
3> ASI的运行性能 高于 AFN

二、对服务器返回的数据处理
1> ASI没有直接提供对服务器数据处理的方式,直接返回data\string
2> AFN提供了多种对服务器数据处理的方式
* JSON处理
* XML处理
* 其他处理

三、监听请求的过程
1> AFN提供了successfailure两个block来监听请求的过程(只能监听成功和失败)
success : 请求成功后调用
failure : 请求失败后调用

2> ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
* 成为代理,遵守协议,实现协议中的代理方法
* 成为代理,不遵守协议,自定义代理方法
* 设置block

四、在文件下载和文件上传的使用难易度
1> AFN
* 不容易监听下载进度和上传进度
* 不容易实现断点续传
* 一般只用来下载不大的文件

2> ASI
* 非常容易实现下载和上传
* 非常容易监听下载进度和上传进度
* 非常容易实现断点续传
* 下载或大或小的文件都行

五、ASI提供了更多的实用功能
1> 控制圈圈要不要在请求过程中转
2> 可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
3> 可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
* 暂停\恢复\取消所有的请求
* 监听整个队列中所有请求的下载进度和上传进度

时间: 2024-12-29 11:40:08

开发经验: 对AFN和ASI各自使用方法及区别的总结的相关文章

IOS开发使用NSURLConnection、NSURLSession、AFN、ASI四种方式实现HTTP请求

概括:HTTP请求可以使用NSURLConnection.NSURLSession.AFN.ASI等方式实现,其中又包括了get.post两种请求方式和同步.异步两种程序执行方式. NSURLConnection 1 get方式的同步请求 /** *  get同步请求 */ -(void) getSynch{ // 获取URL NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/login?use

[BS-27] 创建NSURL的几个方法的区别

创建NSURL的几个方法的区别 URL的基本格式 = 协议://主机地址/路径 URL和Path的区别 * URL:统一资源定位符,格式 “协议+主机名称+路径”   例如:[NSURL URLWithString:@"http://www.baidu.com"]; 本地文件URL字符串格式 file:///Users/wz/Desktop/main.c        //本地文件主机地址是localhost,可以省略,故有3个/ * Path:就是简单的路径,没有协议,没有主机地址 

jquery中html 与 text方法的区别

jquery中html 与 text方法的区别 24 May 2012/in 网站设计和开发 /by Bruce 接鉵jquery的时间并不长,以前都是用直接用js写的,现在发现在jquery这个框架用起来很方便,不但代码量少了,使用也比较简单,对于浏览器的兼容问题也不用担心,在使用的过程中也会遇到一些疑问,在html标签中附加子标签时所用的方法html()与text()的区别. 通常在用jquery写ajax时,都会用到html()这个方法,而不用text()这个方法,他们之间有什么区别呢?

Java中创建对象的5种方式 &amp;&amp;new关键字和newInstance()方法的区别

转载:http://www.kuqin.com/shuoit/20160719/352659.html 用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制.Cla

Hibernate面试题 --- list和iterator方法的区别

Hibernate面试题  ---  list和iterator方法的区别 1.首先看两个例子来比较一下 (1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出: 1 @Test 2 public void listQuery() { 3 4 Configuration configuration = new Configuration().configure(); 5 SessionFacto

Java -- Thread中start和run方法的区别

一.认识Thread的 start() 和 run() 1.start(): 我们先来看看API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法). 多次启动一个线程是非法的.特别是当线程已经结束执行后,不能再重新启动. 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的

RequestDispatcher接口的include()方法与forward()方法的区别

RequestDispatcher接口所定义的forward()方法可以将HTTP请求转送给其他Web资源(例如Servlet.JSP或HTML)进行处理,并产生HTTP回应.RequestDispatcher接口的include()方法与forward()方法非常类似,惟一的不同在于:利用include()方法将HTTP请求转送给其他Servlet后,被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet.RequestDispatcher是一个Web

OO 抽象方法与虚方法的区别

 抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现.] 3.被子类继承后,必须重写: 4.使用关键字abstract修饰: 二.虚方法: 1.可以在抽象类和普通类中定义: 2.可以有方法的实现(方法体,即使空的也要声明) 3.被子类继承后,可以重写也也可以不重写: 4.使用关键字virtrual修饰:

李洪强iOS开发之OC[017]函数和方法的区别

// //  main.m //  15 - 函数和对象的方法的区别 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All rights reserved. // 函数和对象方法的区别 对象方法: - (void)run; #import <Foundation/Foundation.h> @interface Person : NSObject{ @public //定义实例变量 NSString *_nam