AFNetworking2.0

研究AFNetworking框架。

AFNetworking

  1. AFN 与 ASI 有什么区别?
    AFN基于NSURL,ASI基于底层的CFNetwork框架,因此ASI的性能优于AFN.
    AFN采取block的方式处理请求,ASI最初采取delegate的方式处理请求,后面也增加了block的方式。
    AFN只封装了一些常用功能,满足基本需求,直接忽略了很多扩展功能,比如没有封装同步请求;
    ASI提供的功能较多,预留了各种接口和工具供开发者自行扩展。
    AFN直接解析服务器返回的JSON、XML等数据,而ASI比较原始,返回的是NSData二进制数据。
  2. 讲解:
    1>AFHTTPRequestOperation
    HTTP或HTTPS协议请求的AFURLConnectionOperation的子类。它封装的可接受状态码和内容的类型,判定一个请求结果是成功或失败。
    实际上对系统的HTTP网络请求增加了几个HTTP需要用到的参数。
    2>AFURLConnectionOperation
    可以说是AFN最基础的类。继承自NSOperation类,将网络请求依附到一个operation上。从而让我们能够有效的控制并观察一个网络请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态。
    ①:综述
    AFURLConnectionOperation 将Operation和URLConnection结合到一起,利用operation可以监听到状态以及可以建立相互之间的依赖关系的特性,实现了对于 一个NSURLConnection对象的完美控制,并将请求的结果通过block友好的返回。
    ②:实现文件.m
    我们总结下.m中这个类主要有哪些方法。
    1: 首先我们可以看到它创建了一个单例线程。这个线程将会常驻内存,用来处理AFN发起的所有请求任务。当然,线程也跟随着一个runloop,AFN将这个 runloop的模式设置为NSDefaultRunLoopMode。NSDefaultRunLoopMode是无法检测到connection的状 态的。这说明了,AFN将不会在这该线程处理connection完成后的UI刷新等工作,而是会将数据抛给主线程,让主线程去完成UI的刷新。
    2:我们可以看到该类通过接受请求的字符串,创建了URLRequest以及NSURLConnection对象。从而去进行请求。
    3:实现文件多次使用到了锁,可以保证数据的安全。当然他也实现了几个数据的NSCoping协议。
    4:请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态的控制。这里讲一下暂停和恢复。
    暂 停实际上将网络请求取消掉了。但是由于实现了nscoping协议,已经下载到数据得以保存下来。下次进行相同请求的时候,我们会将已经下载到的数据的节 点一起发送给服务器,告诉服务器这些部门的数据我们不需要了,服务器根据我发送的返回节点给我返回相应的数据即可。从而实现了暂停和恢复功能,也就是断点 续传。
    5:operation方法的重写。自行google,这里不赘述。
    6:状态的各种控制方法的实现以及发送状态改变的通知

③:接口文件.h
接口文档中的属性方法,基本可以概括为以下几个方法
1:只读的数据,让管理者可以接收到。
2:设置runloop的modes。不再使用类库默认设置的defaultmodes。
3:状态的控制方法
4:安全策略的设置
总而言之,接口文件.h暴露的接口都是为了让manager可以去完全控制这个operation以及其中的网络请求。

3>AFHTTPRequestOperationManager
这个类是AFN类库的核心类。它封装完成了一种通用的模式,可以帮助我们轻松友好的完成请求的创建、响应的系列化,网络状态的监控以及安全策略以及每一个请求operation的管理(operation的相互依赖或状态改变)。
①:综述
这个类可以说是整个类库的核心类了。据说AFN2.0之前的时候,所有的网络请求相关的设置都杂糅到一个client中,导致client特别的臃肿。2.0后,AFN将一些设置提取出来,线程了专门的类【AFSecurityPolicy、AFURLRequestSerialization、AFURLResponseSerialization】。现在看来,AFN整体的设计是非常完美的。耦合性变得非常低,一些1.0版本中存在的问题也得到了改善。

②:实现文件.m
实现文件较为简单,可以看到他创建了一个队列。并将各个operation加入到队列中。在队列中,各个请求就可以设置依赖关系,并发的数量等等。

③:接口文件.h
接口文件中,我们可以看到。这个类可以设置AFSecurityPolicy、AFURLRequestSerialization、AFURLResponseSerialization 等参数了。这就是综述所说的降低耦合性的方式。基本使用很简单,这里就不再赘述了。

1
2
3
4
5
6
// 基础的URL,主机路径
self.baseURL = url;
// 请求的解析器
self.requestSerializer = [AFHTTPRequestSerializer serializer];
// 响应的解析器(默认直接解析JSON)
self.responseSerializer = [AFJSONResponseSerializer serializer];

使用实例1:GET方法

1
2
3
4
5
6
7
8
9
10
11
//获得请求管理者(管理请求,帮助发请求)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//发送get请求
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"username"]=@"123";
params[@"pwd"]=@"123";
[manager GET:@"http://.....//login" parameters:params success:^(AFHTTPRequestOperation *operation,id responseObject){//responseObject就是字典
NSLog(@"请求成功————",responseObject);
}failure:^(AFHTTPRequestOperation *operation,NSError *error){
NSLog(@"请求失败————",error);
}];

使用实例2:POST方法

1
2
3
4
5
[manager POST:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {       
NSLog(@"%@ %@", responseObject, [NSThread currentThread]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];

使用实例3:XML解析

1
2
// 假如想使用DOM进行解析XML,可以指定响应的类型是二进制。拿到二进制数据就可以进行DOM解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

使用实例4:上传图片、文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// url
NSString *urlStr = @"http://127.0.0.1/post/upload.php";
//获得请求管理者(管理请求,帮助发请求)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"username"]=@"zhangsan";
[manager POST:urlStr parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 要上传的图片的路径,一定要在这个Block中添加文件参数
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"Snip20150123_3.png" withExtension:nil];
[formData appendPartWithFileURL:fileUrl name:@"userfile" fileName:@"123321.png" mimeType:@"image/png" error:NULL];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"success");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"failure");
}];

使用实例5: 网络监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//1.获得网络监控的管理者
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
//2.设置网络状态改变后的处理
[mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
//当网络状态改变了,就会调用这个Block
switch (status) {
case AFNetworkReachabilityStatusUnknown://未知网络
break;
case AFNetworkReachabilityStatusNotReachable://没有网络
break;
case AFNetworkReachabilityStatusReachableViaWWAN://手机自带网络
break;
case AFNetworkReachabilityStatusReachableViaWiFi://wifi
break;
default:
break;
}
}];
//3. 开始监控
[mgr startMonitoring];

面试题

17.ASIHttpRequest、AFNetWorking之间的区别?

  1. ASIHttpRequest功能强大,主要是在MRC下实现的,是对系统CFNetwork API进行了封装,支持HTTP协议的CFHTTP,配置比较复杂,并且ASIHttpRequest框架默认不会帮你监听网络改变,如果需要让ASIHttpRequest帮你监听网络状态改变,并且手动开始这个功能。
  2. AFNetWorking构建于NSURLConnection、NSOperation以及其他熟悉的Foundation技术之上。拥有良好的架构,丰富的API及模块构建方式,使用起来非常轻松。它基于NSOperation封装的,AFURLConnectionOperation子类。
  3. ASIHttpRequest是直接操作对象ASIHttpRequest是一个实现了NSCoding协议的NSOperation子类;AFNetWorking直接操作对象的AFHttpClient,是一个实现NSCoding和NSCopying协议的NSObject子类。
  4. 同步请求:ASIHttpRequest直接通过调用一个startSynchronous方法;AFNetWorking默认没有封装同步请求,如果开发者需要使用同步请求,则需要重写getPath:paraments:success:failures方法,对于AFHttpRequestOperation进行同步处理。
  5. 性能对比:AFNetworking请求优于ASIHttpRequest;
文章目录
  1. 1. AFNetworking
  2. 2. 面试题
本站总访问量 本站访客数人次 ,