AFNetworking

来源:互联网 发布:php mvc框架 编辑:程序博客网 时间:2024/05/18 03:22

AFN


一、什么是AFN

全称是AFNetworking,是对NSURLConnection的一层封装
虽然运行效率没有ASI高,但是使用比ASI简单
在iOS开发中,使用比较广泛
 
二、AFN结构

NSURLConnection
 
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)
 
属性
 
baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
requestSerializer :请求数据格式/默认是二进制的 HTTP
responseSerializer :响应的数据格式/默认是 JSON 格式
operationQueue
reachabilityManager :网络连接管理器
方法
 
manager :方便创建管理器的类方法
HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
GET
POST
NSURLSession
 
AFURLSessionManager
AFHTTPSessionManager(封装了常用的 HTTP 方法)
 
GET
POST
UIKit + AFNetworking 分类
NSProgress :利用KVO
半自动的序列化&反序列化的功能
 
AFURLRequestSerialization :请求的数据格式/默认是二进制的
AFURLResponseSerialization :响应的数据格式/默认是JSON格式
附加功能
 
安全策略
 
HTTPS
AFSecurityPolicy
网络检测
 
对苹果的网络连接检测做了一个封装
AFNetworkReachabilityManager

三、AFN基本使用

1.AFHTTPSessionManager
是AFN中最重要的对象之一
封装了HTTP请求的常见处理
GET\POST请求
解析服务器的响应数据
创建AFHTTPSessionManager
 
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
AFHTTPSessionManager的GET\POST请求
 
// GET请求
/*
     http://120.25.226.186:32812/login?username=520it&pwd=520it
     第一个参数: 请求的地址  http://120.25.226.186:32812/login
     第二个参数: 请求的参数  username=520it&pwd=520it
     第三个参数: 请求成功的回调
     第四个参数: 请求失败的回调
     只要利用AFN发送请求, 如果服务器返回的是JSON数据, 那么AFN会自动将JSON转会成OC对象返回给我们
     */
- (NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(id)parameters
                   success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
 
// POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                   parameters:(id)parameters
                   success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
代码示例:
[objc] view plaincopyprint?
  1. // GET  
  2. - (void)get2  
  3. {  
  4.     // 1.创建AFN管理者  
  5.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  6.    
  7.     // 2.利用AFN管理者发送请求  
  8.     NSDictionary *params = @{  
  9.                              @"username" : @"520it",  
  10.                              @"pwd" : @"520it"  
  11.                              };  
  12.    
  13.     [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^  
  14. (NSURLSessionDataTask *task, id responseObject) {  
  15.          NSLog(@"请求成功---%@", responseObject);  
  16.     } failure:^(NSURLSessionDataTask *task, NSError *error) {  
  17.         NSLog(@"请求失败---%@", error);  
  18.     }];  
  19. }  
  20.    
  21. // POST  
  22. - (void)post2  
  23. {  
  24.     // 1.创建AFN管理者  
  25.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  26.    
  27.     // 2.利用AFN管理者发送请求  
  28.     NSDictionary *params = @{  
  29.                              @"username" : @"520it",  
  30.                              @"pwd" : @"520it"  
  31.                              };  
  32.    
  33.     [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^  
  34. (NSURLSessionDataTask *task, id responseObject) {  
  35.         NSLog(@"请求成功---%@", responseObject);  
  36.     } failure:^(NSURLSessionDataTask *task, NSError *error) {  
  37.         NSLog(@"请求失败---%@", error);  
  38.     }];  
  39. }  

2.AFHTTPRequestOperationManager

[objc] view plaincopyprint?
  1. 创建AFHTTPRequestOperationManager  
  2.    
  3. // 1.创建AFN管理者  
  4.     // AFHTTPRequestOperationManager内部包装了NSURLConnection  
  5.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  6. AFHTTPRequestOperationManager的GET\POST请求  
  7.    
  8. // GET  
  9. - (NSURLSessionDataTask *)GET:(NSString *)URLString  
  10.                    parameters:(id)parameters  
  11.                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success  
  12.                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure  
  13.    
  14. // POST请求  
  15. - (NSURLSessionDataTask *)POST:(NSString *)URLString  
  16.                     parameters:(id)parameters  
  17.                        success:(void (^)(NSURLSessionDataTask *task, id responseObject))success  
  18.                        failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure  

代码示例:

[objc] view plaincopyprint?
  1. - (void)get  
  2. {  
  3.     // 1.创建AFN管理者  
  4.     // AFHTTPRequestOperationManager内部包装了NSURLConnection  
  5.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  6.    
  7.     // 2.利用AFN管理者发送请求  
  8.     NSDictionary *params = @{  
  9.                              @"username" : @"520it",  
  10.                              @"pwd" : @"520it"  
  11.                              };  
  12.     [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^  
  13. (AFHTTPRequestOperation *operation, id responseObject) {  
  14.          NSLog(@"请求成功---%@", responseObject);  
  15.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  16.          NSLog(@"请求失败---%@", error);  
  17.     }];  
  18. }  
  19.    
  20. - (void)post  
  21. {  
  22.     // 1.创建AFN管理者  
  23.     // AFHTTPRequestOperationManager内部包装了NSURLConnection  
  24.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  25.    
  26.     // 2.利用AFN管理者发送请求  
  27.     NSDictionary *params = @{  
  28.                              @"username" : @"520it",  
  29.                              @"pwd" : @"520it"  
  30.                              };  
  31.     [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^  
  32. (AFHTTPRequestOperation *operation, id responseObject) {  
  33.         NSLog(@"请求成功---%@", responseObject);  
  34.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  35.         NSLog(@"请求失败---%@", error);  
  36.     }];  
  37. }  

四、AFN文件下载

[objc] view plaincopyprint?
  1. // 执行下载文件的方法,可以监控下载进度  
  2. - (void)downLoadMonitor  
  3. {  
  4.     // 1.创建网络管理者  
  5.     // AFHTTPSessionManager 基于NSURLSession  
  6.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  7.    
  8.     // 2.利用网络管理者下载数据  
  9.     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@  
  10. "http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];  
  11.     /* 
  12.      destination 
  13.      - targetPath: 系统给我们自动写入的文件路径 
  14.      - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径 
  15.      completionHandler 
  16.      - url :destination返回的URL == block的返回的路径 
  17.      */  
  18.     /* 
  19.      @property int64_t totalUnitCount;  需要下载文件的总大小 
  20.      @property int64_t completedUnitCount; 当前已经下载的大小 
  21.      */  
  22.     NSProgress *progress = nil;  
  23.     NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request   
  24. progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {  
  25.    
  26.         NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,   
  27. NSUserDomainMask, YES) lastObject];  
  28.         NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];  
  29.         return [NSURL fileURLWithPath:path];  
  30.    
  31.     } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {  
  32.         NSLog(@"%@",filePath.absoluteString);  
  33.    
  34.     }];  
  35.    
  36.     /* 
  37.      要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类! 
  38.      NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听! 
  39.      @property int64_t totalUnitCount;        总单位数 
  40.      @property int64_t completedUnitCount;    完成单位数 
  41.      */  
  42.     // 给Progress添加监听 KVO  
  43.     [progress addObserver:self forKeyPath:@"completedUnitCount"   
  44. options:NSKeyValueObservingOptionNew context:nil];  
  45.    
  46.     // 3.启动任务  
  47.     [downTask resume];  
  48.    
  49. }  
  50.    
  51. // 收到通知调用的方法  
  52. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object   
  53. change:(NSDictionary *)change context:(voidvoid *)context  
  54. {  
  55.     NSLog(@"%f",1.0 * object.completedUnitCount / object.totalUnitCount);  
  56.     // 回到主队列刷新UI  
  57.     dispatch_async(dispatch_get_main_queue(), ^{  
  58.    
  59.         self.progress.progress = 1.0 * object.completedUnitCount / object.totalUnitCount;  
  60.     });  
  61. }  

五、AFN序列化

默认是JSON数据,接收类型是JSON
 
如果接收的类型和返回的类型不匹配会报错

[objc] view plaincopyprint?
  1. // 1.创建AFN管理者  
  2.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  3.    
  4.     // 默认请求二进制  
  5.     // 默认响应是JSON  
  6.    
  7.     // 告诉AFN,支持接受 text/xml 的数据  
  8.     // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet   
  9. setWithObject:@"text/xml"];  
  10.    
  11.     // 告诉AFN如何解析数据  
  12.     // 告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理  
  13. //    manager.responseSerializer = [AFJSONResponseSerializer serializer];  
  14.     // 告诉AFN客户端, 将返回的数据当做XML来处理  
  15. //    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];  
  16.     // 告诉AFN客户端, 将返回的数据当做而进行来数据 (服务器返回什么就是什么)  
  17.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  

六、AFN文件上传

[objc] view plaincopyprint?
  1. // formData: 专门用于拼接需要上传的数据  
  2. - (NSURLSessionDataTask *)POST:(NSString *)URLString  
  3.                     parameters:(id)parameters  
  4.      constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block  
  5.                     success:(void (^)(NSURLSessionDataTask *task, id responseObject))success  
  6.                     failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure  

AFN上传文件代码示例:

[objc] view plaincopyprint?
  1. // 1.创建网络管理者  
  2.   AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  3.   // 2.利用网络管理者上传数据  
  4.   NSDictionary *dict = @{@"username":@"Syl"};  
  5.   // formData: 专门用于拼接需要上传的数据  
  6.   [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict   
  7. constructingBodyWithBlock:  
  8.    ^void(id<AFMultipartFormData> formData) {  
  9.    
  10.       /* 
  11.        Data: 需要上传的数据 
  12.        name: 服务器参数的名称 
  13.        fileName: 文件名称 
  14.        mimeType: 文件的类型 
  15.        */  
  16.       UIImage *image =[UIImage imageNamed:@"minion_02"];  
  17.       NSData *data = UIImagePNGRepresentation(image);  
  18.       [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png"   
  19. mimeType:@"image/png"];  
  20.    
  21.       /* 
  22.        NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/ 
  23. CertificateSigningRequest.certSigningRequest"]; 
  24.        // 任意的二进制数据MIMEType application/octet-stream 
  25.        // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer"  
  26. mimeType:@"application/octet-stream" error:nil]; 
  27.        [formData appendPartWithFileURL:url name:@"file" error:nil]; 
  28.       */  
  29.   } success:^void(NSURLSessionDataTask * task, id responseObject) {  
  30.       // 请求成功  
  31.       NSLog(@"请求成功 %@", responseObject);  
  32.   } failure:^void(NSURLSessionDataTask * task, NSError * error) {  
  33.       // 请求失败  
  34.       NSLog(@"请求失败 %@", error);  
  35.   }];  

七、监控联网状态

1.AFN监控联网状态
联网状态status
[objc] view plaincopyprint?
  1. // 2.设置监听  
  2.     /* 
  3.      AFNetworkReachabilityStatusUnknown          = -1,  未识别 
  4.      AFNetworkReachabilityStatusNotReachable     = 0,   未连接 
  5.      AFNetworkReachabilityStatusReachableViaWWAN = 1,   3G 
  6.      AFNetworkReachabilityStatusReachableViaWiFi = 2,  wifi 
  7.      */  
  8. 示例代码  
  9.    
  10. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];  
  11.    
  12. // 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法  
  13. [manager startMonitoring];  
  14.    
  15. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
  16.     NSLog(@"%d", status);  
  17. }];  

2.Reachability监控联网状态苹果提供,导入这两个类使用
[objc] view plaincopyprint?
  1. // 1.检测wifi状态  
  2.     Reachability *wifi = [Reachability reachabilityForLocalWiFi];  
  3.    
  4.     // 2.检测手机是否能上网络(WIFI\3G\2.5G)  
  5.     Reachability *conn = [Reachability reachabilityForInternetConnection];  
  6.    
  7.     // 3.判断网络状态  
  8.     if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi  
  9.         NSLog(@"有wifi");  
  10.    
  11.     } else if ([conn currentReachabilityStatus] != NotReachable) {   
  12. // 没有使用wifi, 使用手机自带网络进行上网  
  13.         NSLog(@"使用手机自带网络进行上网");  
  14.    
  15.     } else { // 没有网络  
  16.    
  17.         NSLog(@"没有网络");  
  18.     }  
  19. ①判断联网状态  
  20.    
  21. // 用WIFI  
  22. // [wifi currentReachabilityStatus] != NotReachable  
  23. // [conn currentReachabilityStatus] != NotReachable  
  24.    
  25. // 没有用WIFI, 只用了手机网络  
  26. // [wifi currentReachabilityStatus] == NotReachable  
  27. // [conn currentReachabilityStatus] != NotReachable  
  28.    
  29. // 没有网络  
  30. // [wifi currentReachabilityStatus] == NotReachable  
  31. // [conn currentReachabilityStatus] == NotReachable  
  32. ②实时监听网络状态  
  33.    
  34. #import "ViewController.h"  
  35. #import "Reachability.h"  
  36.    
  37. @interface HMViewController ()  
  38. @property (nonatomicstrongReachability *conn;  
  39. @end  
  40.    
  41. @implementation HMViewController  
  42.    
  43. - (void)viewDidLoad  
  44. {  
  45.     [super viewDidLoad];  
  46.    
  47.     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState)  
  48.  name:kReachabilityChangedNotification object:nil];  
  49.     self.conn = [Reachability reachabilityForInternetConnection];  
  50.     [self.conn startNotifier];  
  51. }  
  52.    
  53. - (void)dealloc  
  54. {  
  55.     [self.conn stopNotifier];  
  56.     [[NSNotificationCenter defaultCenter] removeObserver:self];  
  57. }  
  58.    
  59. - (void)checkNetworkState  
  60. {  
  61.     // 1.检测wifi状态  
  62.     Reachability *wifi = [Reachability reachabilityForLocalWiFi];  
  63.    
  64.     // 2.检测手机是否能上网络(WIFI\3G\2.5G)  
  65.     Reachability *conn = [Reachability reachabilityForInternetConnection];  
  66.    
  67.     // 3.判断网络状态  
  68.     if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi  
  69.         NSLog(@"有wifi");  
  70.    
  71.     } else if ([conn currentReachabilityStatus] != NotReachable) {   
  72. // 没有使用wifi, 使用手机自带网络进行上网  
  73.         NSLog(@"使用手机自带网络进行上网");  
  74.    
  75.     } else { // 没有网络  
  76.    
  77.         NSLog(@"没有网络");  
  78.     }  
  79. }  
  80. @end

0 0
原创粉丝点击