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()方法
时间: 2024-08-08 01:13:45

AFN的简单封装抽取工具类的相关文章

Swift:简单封装一个工具类模板

创建模板类(封装一个类)新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var description: String var price: Double var stock: Int init(name: String, description: String, price: Double, stock: Int) { self.name = name self.description =

保存一下简单封装的工具类JsonUtils 、android网络判断的Utils 是否连接无wifi、sdcard状态的utils

1.JsonUtils    json和实体类之间相互转换 随便提一下  App版本升级   github上有开源框架可以看一下VersionUpdate: public class JsonUtils { /** * 将一个实体类转换成json字符串(对象中可以包含集合) */ public static <T> String beanToJson(T t){ Gson gson = new Gson(); String json = gson.toJson(t); return json;

使用Resources类搭建Unity简单的资源管理工具类

Unity资源加载的方式有: 1.脚本拖拽(本地) 2.Resources加载(本地) ★ 3.AssetBundle加载(本地,远程[www])★ 本篇将使用Resources类搭建一个简单的资源管理工具类 Resources是Unity下的特殊文件夹,使用需自行创建Resources文件夹(命名必须正确) 使用Resources文件夹就需要用到Resources类的一些方法,如下: Resources类 Load 从Resources文件夹加载单个资源(可指定类型) LoadAll 从Res

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

iOS开发项目篇—21抽取工具类

iOS开发项目篇—21抽取工具类 一.抽取宏 把和应用相关的信息抽取出来 App Key:1972915028 App Secret:b255603c4dfd82b4785bf9a808ce2662 回调地址:http://www.cnblogs.com/wendingding/ (1)appkey和回调页面在很多地方都要用到 (2)如果是不同应用的话,只需要把这几个参数换掉就可以了.把它们抽取成一个宏,写到pch文件中. 项目的PCH文件 1 #import <Availability.h>

导入导出封装的工具类 (一) 利用POI封装

对于导入导出各个项目中几乎都会用到,记得在高校平台中封装过导入导出这部分今天看了看是利用JXL封装的而经理说让我用POI写写导出,这两个导入导出框架是目前比较流程和常用的框架,有必要都了解一下. 写了写代码觉得导入导出这一块底层都是一样的,几乎所有的框架和别的牛人也好都是底层利用POI或JXL实现,比的是谁对这部分封装的好而且每个项目中对导入导出具体的细节是不同的,因此,有必要了解了解怎么样操作POI,学学使用它的API做导入导出也许第一步你封装的没有别人那么好,你也会收获很多了解他们封装的思路

轻松把玩HttpClient之封装HttpClient工具类(七),新增验证码识别功能

这个HttpClientUtil工具类分享在GitHub上已经半年多的时间了,并且得到了不小的关注,有25颗star,被fork了38次.有了大家的鼓励,工具类一直也在完善中.最近比较忙,两个多月前的修改在今天刚修改测试完成,今天再次分享给大家. 验证码识别这项技术并不是本工具类的功能,而是通过一个开源的api来识别验证码的.这里做了一个简单的封装,主要是用来解决登陆时的验证码的问题.在线验证码识别官网:http://lab.ocrking.com/,github地址:https://githu

轻松把玩HttpClient之封装HttpClient工具类(二),插件式配置HttpClient对象

上一篇文章中,简单分享一下封装HttpClient工具类的思路及部分代码,本文将分享如何实现插件式配置HttpClient对象. 如果你看过我前面的几篇关于HttpClient的文章或者官网示例,应该都知道HttpClient对象在创建时,都可以设置各种参数,但是却没有简单的进行封装,比如对我来说比较重要的3个:代理.ssl(包含绕过证书验证和自定义证书验证).超时.还需要自己写.所以这里我就简单封装了一下,顺便还封装了一个连接池的配置. 其实说是插件式配置,那是高大上的说法,说白了,就是采用了

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式,而非Ja