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()方法

 

posted @ 2016-04-22 22:07  hanfengs  阅读(1275)  评论(0编辑  收藏  举报