开发经验: 对AFN和ASI各自使用方法及区别的总结
2015-03-19 11:03
288 查看
经过多年的iOS开发, 现总结一下HTTP协议下的两大网络处理第三方框架的使用心得
1.AFHTTPRequestOperationManager
* 对NSURLConnection的封装
2.AFHTTPSessionManager
* 对
二、
1.创建管理者
2.封装请求参数
3.发送请求
三、对服务器返回数据的解析
1.AFN可以自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当做JSON来解析
2.设置对服务器返回数据的解析方式
1> 当做是JSON来解析(默认做法)
*
*
2> 当做是XML来解析
*
*
3> 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
*
3.注意
* 服务器返回的数据一定要跟responseSerializer对得上
1> 服务器返回的是JSON数据
*
*
2> 服务器返回的是XML数据
*
*
3> 服务器返回的是其他数据
*
1.发送GET请求:
2.发送POST请求:
* 设置参数
二、发送请求
1.同步请求
*
2.异步请求
*
三、监听请求的过程
1.如何监听请求过程
1> 为代理,遵守
2> 成为代理,不遵守
3> 设置block
2.监听的使用注意
* 如果同时设置了block和实现了代理方法,请求过程中,block和代理方法都会调用
* 一般的调用顺序:代理方法 > block
3.如果实现了下面的代理方法,那么
四、文件下载
1.一般的下载
1> 设置文件下载的保存路径
2> 设置进度监听的代理(要想成为进度监听代理,最好遵守
2.断点下载(断点续传)
1> 设置文件下载的临时路径
2> 设置支持断点续传
五、文件上传(设置文件参数)
1.如果知道文件路径,最好就用这个方法(因为简单)
2.如果文件数据是动态产生的,就用这个方法(比如刚拍照完获得的图片数据)
六、
1.请求超时
2.获得错误信息
3.获得响应数据
1> AFN的底层基于OC的
2> ASI的底层基于纯C语言的
3> ASI的运行性能 高于 AFN
二、对服务器返回的数据处理
1> ASI没有直接提供对服务器数据处理的方式,直接返回data\string
2> AFN提供了多种对服务器数据处理的方式
* JSON处理
* XML处理
* 其他处理
三、监听请求的过程
1> AFN提供了
*
*
2> ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
* 成为代理,遵守协议,实现协议中的代理方法
* 成为代理,不遵守协议,自定义代理方法
* 设置block
四、在文件下载和文件上传的使用难易度
1> AFN
* 不容易监听下载进度和上传进度
* 不容易实现断点续传
* 一般只用来下载不大的文件
2> ASI
* 非常容易实现下载和上传
* 非常容易监听下载进度和上传进度
* 非常容易实现断点续传
* 下载或大或小的文件都行
五、ASI提供了更多的实用功能
1> 控制圈圈要不要在请求过程中转
2> 可以轻松地设置请求之间的依赖:每一个请求都是一个
3> 可以统一管理所有请求(还专门提供了一个叫做
* 暂停\恢复\取消所有的请求
* 监听整个队列中所有请求的下载进度和上传进度
首先来说下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来管理所有的请求对象)
* 暂停\恢复\取消所有的请求
* 监听整个队列中所有请求的下载进度和上传进度
相关文章推荐
- 对AFN和ASI各自使用方法及区别的总结
- AFN和ASI各自使用方法及区别的总结
- 使用xmanager登陆cetos6.3的方法经验总结
- 使用PCA降维方法的人脸识别实验(经验总结
- 敏捷开发方法Scrum经验总结 推荐
- android开发环境搭建与SVN使用经验总结
- 使用JfreeChart开发图表经验总结
- 总结:ADO.NET在开发中的部分使用方法和技巧
- jquery开发中使用经验总结。
- 总结:ADO.NET在开发中的部分使用方法和技巧
- Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用
- 总结:ADO.NET在开发中的部分使用方法和技巧
- 使用JfreeChart开发图表经验总结(含源码)
- 【.Net Compact Framework开发】 使用 Visual Studio 对移动项目进行Unit Testing的方法总结
- kshen转总结:ADO.NET在开发中的部分使用方法和技巧
- 总结:ADO.NET在开发中的部分使用方法和技巧
- 经验总结:Sybase ASA9/ASA10的使用方法
- 使用JfreeChart开发图表经验总结 转帖
- MAC下使用Tomcat+eclipse+mysql+git+jdk开发网游后台程序经验总结
- iOS_开发经验总结:键盘遮挡输入框时的解决方法