zoukankan      html  css  js  c++  java
  • iOS----轻松掌握AFN网络顶级框架

    AFN

    一、什么是AFN

    二、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请求的常见处理
    • GETPOST请求
    • 解析服务器的响应数据

    创建AFHTTPSessionManager

    AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    

    AFHTTPSessionManager的GETPOST请求

    // 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
    

    代码示例

    // GET
    - (void)get2
    {
        // 1.创建AFN管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        // 2.利用AFN管理者发送请求
        NSDictionary *params = @{
                                 @"username" : @"520it",
                                 @"pwd" : @"520it"
                                 };
    
        [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
             NSLog(@"请求成功---%@", responseObject);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            NSLog(@"请求失败---%@", error);
        }];
    }
    
    // POST
    - (void)post2
    {
        // 1.创建AFN管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        // 2.利用AFN管理者发送请求
        NSDictionary *params = @{
                                 @"username" : @"520it",
                                 @"pwd" : @"520it"
                                 };
    
        [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
            NSLog(@"请求成功---%@", responseObject);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            NSLog(@"请求失败---%@", error);
        }];
    }
    

    2.AFHTTPRequestOperationManager

    创建AFHTTPRequestOperationManager

    // 1.创建AFN管理者
        // AFHTTPRequestOperationManager内部包装了NSURLConnection
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    

    AFHTTPRequestOperationManager的GETPOST请求

    // GET
    - (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
    

    代码示例

    - (void)get
    {
        // 1.创建AFN管理者
        // AFHTTPRequestOperationManager内部包装了NSURLConnection
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
        // 2.利用AFN管理者发送请求
        NSDictionary *params = @{
                                 @"username" : @"520it",
                                 @"pwd" : @"520it"
                                 };
        [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
             NSLog(@"请求成功---%@", responseObject);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"请求失败---%@", error);
        }];
    }
    
    - (void)post
    {
        // 1.创建AFN管理者
        // AFHTTPRequestOperationManager内部包装了NSURLConnection
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
        // 2.利用AFN管理者发送请求
        NSDictionary *params = @{
                                 @"username" : @"520it",
                                 @"pwd" : @"520it"
                                 };
        [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"请求成功---%@", responseObject);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"请求失败---%@", error);
        }];
    }
    

    四、AFN文件下载

    // 执行下载文件的方法,可以监控下载进度
    - (void)downLoadMonitor
    {
        // 1.创建网络管理者
        // AFHTTPSessionManager 基于NSURLSession
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        // 2.利用网络管理者下载数据
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
        /*
         destination
         - targetPath: 系统给我们自动写入的文件路径
         - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
         completionHandler
         - url :destination返回的URL == block的返回的路径
         */
        /*
         @property int64_t totalUnitCount;  需要下载文件的总大小
         @property int64_t completedUnitCount; 当前已经下载的大小
         */
        NSProgress *progress = nil;
        NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    
            NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
            NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
            return [NSURL fileURLWithPath:path];
    
        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
            NSLog(@"%@",filePath.absoluteString);
    
        }];
    
        /*
         要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
         NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
         @property int64_t totalUnitCount;        总单位数
         @property int64_t completedUnitCount;    完成单位数
         */
        // 给Progress添加监听 KVO
        [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
    
        // 3.启动任务
        [downTask resume];
    
    }
    
    // 收到通知调用的方法
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object change:(NSDictionary *)change context:(void *)context
    {
        NSLog(@"%f",1.0 * object.completedUnitCount / object.totalUnitCount);
        // 回到主队列刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
    
            self.progress.progress = 1.0 * object.completedUnitCount / object.totalUnitCount;
        });
    }
    

    五、AFN序列化

    • 默认是JSON数据,接收类型是JSON
      • 如果接收的类型和返回的类型不匹配会报错
      // 1.创建AFN管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        // 默认请求二进制
        // 默认响应是JSON
    
        // 告诉AFN,支持接受 text/xml 的数据
        // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
    
        // 告诉AFN如何解析数据
        // 告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理
    //    manager.responseSerializer = [AFJSONResponseSerializer serializer];
        // 告诉AFN客户端, 将返回的数据当做XML来处理
    //    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
        // 告诉AFN客户端, 将返回的数据当做而进行来数据 (服务器返回什么就是什么)
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    

    六、AFN文件上传

    // formData: 专门用于拼接需要上传的数据
    - (NSURLSessionDataTask *)POST:(NSString *)URLString
                        parameters:(id)parameters
         constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                        success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                        failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
    

    AFN上传文件代码示例

        // 1.创建网络管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        // 2.利用网络管理者上传数据
        NSDictionary *dict = @{@"username":@"Syl"};
        // formData: 专门用于拼接需要上传的数据
        [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:
         ^void(id<AFMultipartFormData> formData) {
    
            /*
             Data: 需要上传的数据
             name: 服务器参数的名称
             fileName: 文件名称
             mimeType: 文件的类型
             */
            UIImage *image =[UIImage imageNamed:@"minion_02"];
            NSData *data = UIImagePNGRepresentation(image);
            [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" mimeType:@"image/png"];
    
            /*
             NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/CertificateSigningRequest.certSigningRequest"];
             // 任意的二进制数据MIMEType application/octet-stream
             // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer" mimeType:@"application/octet-stream" error:nil];
             [formData appendPartWithFileURL:url name:@"file" error:nil];
            */
        } success:^void(NSURLSessionDataTask * task, id responseObject) {
            // 请求成功
            NSLog(@"请求成功 %@", responseObject);
        } failure:^void(NSURLSessionDataTask * task, NSError * error) {
            // 请求失败
            NSLog(@"请求失败 %@", error);
        }];
    

    七、监控联网状态

    1.AFN监控联网状态

    联网状态status

    // 2.设置监听
        /*
         AFNetworkReachabilityStatusUnknown          = -1,  未识别
         AFNetworkReachabilityStatusNotReachable     = 0,   未连接
         AFNetworkReachabilityStatusReachableViaWWAN = 1,   3G
         AFNetworkReachabilityStatusReachableViaWiFi = 2,  wifi
         */
    

    示例代码

    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
    // 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
    [manager startMonitoring];
    
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        NSLog(@"%d", status);
    }];
    

    2.Reachability监控联网状态苹果提供,导入这两个类使用

        // 1.检测wifi状态
        Reachability *wifi = [Reachability reachabilityForLocalWiFi];
    
        // 2.检测手机是否能上网络(WIFI3G2.5G)
        Reachability *conn = [Reachability reachabilityForInternetConnection];
    
        // 3.判断网络状态
        if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
            NSLog(@"有wifi");
    
        } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
            NSLog(@"使用手机自带网络进行上网");
    
        } else { // 没有网络
    
            NSLog(@"没有网络");
        }
    

    ①判断联网状态

    // 用WIFI
    // [wifi currentReachabilityStatus] != NotReachable
    // [conn currentReachabilityStatus] != NotReachable
    
    // 没有用WIFI, 只用了手机网络
    // [wifi currentReachabilityStatus] == NotReachable
    // [conn currentReachabilityStatus] != NotReachable
    
    // 没有网络
    // [wifi currentReachabilityStatus] == NotReachable
    // [conn currentReachabilityStatus] == NotReachable
    

    ②实时监听网络状态

    #import "ViewController.h"
    #import "Reachability.h"
    
    @interface HMViewController ()
    @property (nonatomic, strong) Reachability *conn;
    @end
    
    @implementation HMViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState) name:kReachabilityChangedNotification object:nil];
        self.conn = [Reachability reachabilityForInternetConnection];
        [self.conn startNotifier];
    }
    
    - (void)dealloc
    {
        [self.conn stopNotifier];
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    - (void)checkNetworkState
    {
        // 1.检测wifi状态
        Reachability *wifi = [Reachability reachabilityForLocalWiFi];
    
        // 2.检测手机是否能上网络(WIFI3G2.5G)
        Reachability *conn = [Reachability reachabilityForInternetConnection];
    
        // 3.判断网络状态
        if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
            NSLog(@"有wifi");
    
        } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
            NSLog(@"使用手机自带网络进行上网");
    
        } else { // 没有网络
    
            NSLog(@"没有网络");
        }
    }
    @end
    
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/ShaoYinling/p/4731436.html
Copyright © 2011-2022 走看看