zoukankan      html  css  js  c++  java
  • AFN的简单封装抽取工具类

    ✓AFN获取数据----by hanfeng

     AFN是对 NSURLConnection,NSURLSession的封装

    AFNetworking3.0删除了了对 NSURLConnection的封装内容

    这是因为,NSURLSession能够完全替代NSURLConnection,并且具有很多优点

    • 支持后台运行的网络任务
    • 暂停、停止、重启网络任务,不需要自己封装NSOperation
    • 支持断点续传,异步下载
    • 支持上传,异步上传
    • 获取下载、上传的进度 

    NSURLSession有3种任务

    1. NSURLSessionDataTask 用于小数据任务,例如网页
    2. NSURLSessionUploadTask 用于上传
    3. NSURLSessionDownloadTask 用于大文件的下载

    AFNetworking3.0就是对上述3种任务的封装,默认支持json的序列化和反序列化,封装了Reachability判读网络是否连接,具有优秀的错误处理机制等优点。

    直接使用AFN的时候,非常简单,只需要,创建一个实例对象或者单列,然后 GET 或者 POST即可。

    ✓AFN的封装----by hanfeng

    通过对AFN的封装类,在项目中把AFN代码与网络请求的代码隔离开,这样做的好处是,一旦AFN出现重大bug或者我们更换另外的第三方网络请求框架时,会比较简单和方便。可以想象,如果我们自己的项目中到处充斥的都是直接使用AFN网络请求,那么修改和维护代码将是多么的麻烦。

    封装AFN只需要一下3步:

    1, 新建一个类,继承自AFN,如果我们只用到HTTP,可以直接继承AFHTTPSessionManager

    2, 在类中提供一个类方法,用于创建这个类的对象,可以使用单例模式

    3, 在类中提供一个对象方法,用于进行网络请求,提供参数,可以进行GET、POST、HEAD等请求。

    具体示例demo

     1 //
     2 //  ASNetworkingTools.h
     3 //  测试03-AFN封装OC
     4 //
     5 //  Created by hanfeng on 16/4/19.
     6 //  Copyright © 2016年 hanfeng. All rights reserved.
     7 //
     8 
     9 #import "AFHTTPSessionManager.h"
    10 
    11 //枚举,列出请求的方式,还可以继续添加
    12 typedef enum: NSInteger{
    13     GET,
    14     POST,
    15     HEADER
    16 }ASRequestMethod;
    17 
    18 
    19 @interface ASNetworkingTools : AFHTTPSessionManager
    20 
    21 + (instancetype)sharedTools;
    22 - (void)request:(ASRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void(^)(id result, NSError *error))finished;
    23 
    24 @end
    //
    //  ASNetworkingTools.m
    //  测试03-AFN封装OC
    //
    //  Created by hanfeng on 16/4/19.
    //  Copyright © 2016年 hanfeng. All rights reserved.
    //
    
    #import "ASNetworkingTools.h"
    
    @protocol ASNetworkingToolsProxy <NSObject>
    /*
        这个方法实际是AFN中GET,POST调用的方法 -dataTaskWithHTTPMethod
        但是,Xcode不提示,可以设计一个协议,提示这个方法,并使编译通过
        这个方法,可以去AFN代码中直接复制过来
     */
    @optional
    - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                           URLString:(NSString *)URLString
                                          parameters:(id)parameters
                                             success:(void (^)(NSURLSessionDataTask *, id))success
                                             failure:(void (^)(NSURLSessionDataTask *, NSError *))failure;
    
    
    @end
    
    @interface ASNetworkingTools ()<ASNetworkingToolsProxy>
    
    @end
    
    @implementation ASNetworkingTools
    
    //网络工具的类方法,单例模式
    +(instancetype)sharedTools{
        static ASNetworkingTools *sharedTools;
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            NSURL *baseUrl = [NSURL URLWithString:@"http://httpbin.org/"];
            sharedTools = [[self alloc] initWithBaseURL:baseUrl];
            
        });
        return sharedTools;
    }
    
    //封装的对象方法,把AFN方法封装为 自己的 -request(参数1,参数2,参数3,参数4)方法使用在项目中
    -(void)request:(ASRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id, NSError *))finished{
        
        NSString *methodName = (method == GET) ? @"GET" : @"POST";
        
        /*
            这样把success和failure,成功和失败封装到一个finished方法中
         */
        [[self dataTaskWithHTTPMethod:methodName URLString:urlString parameters:parameters success:^(NSURLSessionDataTask *task, id result) {
            finished(result, nil);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            finished(nil, error);
        }] resume];
        
        
        if (method == GET) {
            
            [self GET:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                
                finished(responseObject, nil);
                
            } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
               
                finished(nil, error);
                
            }];
            
        } else if (method == POST) {
            
            [self POST:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                
                finished(responseObject, nil);
                
            } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
               
                finished(nil, error);
                
            }];
            
        } else if (method == HEADER) {
            
            //通过枚举判断还可调用,HEADER PUT DELETE方法
        }
    }
    @end

     

    ✓JSON数据的解析----by hanfeng

    json数据解析的方式有多种,

    1. 苹果原生的NSJSONSerialization 
    2. JSONKit
    3. SBJson
    4. 通过AFN方式返回的json数据会自动进行解析

    一般来说,用苹果原生的 NSJSONSerialization就可以满足json数据解析的需求

    • NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
    • JSON解析返回的对象是数组或字典,根据原始数据是由[] 或者 {}括起来的
    • 如果JSON数据中有中文,输出的是经过Unicode编码的内容
    • NSArray,NSDictionary重写-descriptionWithLocale()方法
    • NSobject重写-description()方法
  • 相关阅读:
    Filter 过滤器
    struts2 action接收请求参数和类型转换
    Struts2入门学习
    struts2请求参数校验
    IntelliJ IDEA 使用心得与常用快捷键
    关于动态代理详解
    web.xml文件详解
    关于mysql插入数据异常
    关于控制台输出 警告 log4j:WARN No appenders could be found for logger
    Hive load from hdfs 出错
  • 原文地址:https://www.cnblogs.com/hanfengs/p/5422970.html
Copyright © 2011-2022 走看看