您的位置:首页 > 其它

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

2015-03-19 11:03 288 查看
经过多年的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的
NSURLConnection
NSURLSession


2> ASI的底层基于纯C语言的
CFNetwork
框架

3> ASI的运行性能 高于 AFN

二、对服务器返回的数据处理

1> ASI没有直接提供对服务器数据处理的方式,直接返回data\string

2> AFN提供了多种对服务器数据处理的方式

* JSON处理

* XML处理

* 其他处理

三、监听请求的过程

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

*
success
: 请求成功后调用

*
failure
: 请求失败后调用

2> ASI提供了3套方案,每一套方案都能监听请求的完整过程

(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)

* 成为代理,遵守协议,实现协议中的代理方法

* 成为代理,不遵守协议,自定义代理方法

* 设置block

四、在文件下载和文件上传的使用难易度

1> AFN

* 不容易监听下载进度和上传进度

* 不容易实现断点续传

* 一般只用来下载不大的文件

2> ASI

* 非常容易实现下载和上传

* 非常容易监听下载进度和上传进度

* 非常容易实现断点续传

* 下载或大或小的文件都行

五、ASI提供了更多的实用功能

1> 控制圈圈要不要在请求过程中转

2> 可以轻松地设置请求之间的依赖:每一个请求都是一个
NSOperation
对象

3> 可以统一管理所有请求(还专门提供了一个叫做
ASINetworkQueue
来管理所有的请求对象)

* 暂停\恢复\取消所有的请求

* 监听整个队列中所有请求的下载进度和上传进度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: