前言
在十分钟搭建主流框架_简单的网络部分(OC) 中,我们使用AFN框架顺利的发送网络请求并返回了有用数据,但对AFN框架的依赖十分严重,下面我们重构一下。
源码github地址
初步
- 很多时候,我们涉及到网络请求这块,都离不开几个第三方框架,
AFNetworking,MJExtention,MBProgressHUD(SV)。 初学的时候,都会把它们写到Controller里面,如下:
123456789101112[[AFHTTPSessionManager manager] GET:CYXRequestURL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {NSLog(@"请求成功");// 利用MJExtension框架进行字典转模型weakSelf.menus = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];// 刷新数据(若不刷新数据会显示不出)[weakSelf.tableView reloadData];} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {NSLog(@"请求失败 原因:%@",error);}];这样会造成耦合性过高的问题,灵活性也非常不好,因此,AFN的作者也推荐我们不要直接使用,新建一个网络请求类来继承AFN的使用方式更好。
因此,继承的方式,如下:
CYXHTTPSessionManager.h文件
123@interface CYXHTTPSessionManager : AFHTTPSessionManager@endCYXHTTPSessionManager.m文件
12345678910@implementation CYXHTTPSessionManager+ (instancetype)manager{CYXHTTPSessionManager *mgr = [super manager];// 这里可以做一些统一的配置// mgr.responseSerializer = ;// mgr.requestSerializer = ;return mgr;}@end
调用方式:
  | 
  | 
- 这样,已经降低了一点耦合度,也不需要在每个需要发送网络请求的Controller中引入AFN框架了。但对于MJExtension框架的依赖还是没有改善。
 
进阶
通过观察,我们发现其实大部分的GET和POST请求的前几步基本使用步骤是大致相同的,相同的步骤如下:
- 1.通过AFN请求回来JSON数据
 - 2.通过JSON数据,取出需要使用的字典数组/字典
 - 3.使用字典转模型框架(MJExtension)把字典数组转化为模型数组/字典转化为模型
 
因此,我们思考能不能把这些相同的步骤封装起来,以后就不需要重复写这些代码了,我们都知道一条经典的编程法则:“Don’t repeat youself”。这就是我们封装与重构的理由!
1.基层请求的封装
- 本文示例封装POST请求
 - CYXHttpRequest.h文件
 
  | 
  | 
- CYXHttpRequest.m文件
 
  | 
  | 
- 现在已经可以把网络数据请求回来了,轮到第二个步骤了:观察请求回来的JSON数据,取出需要使用的字典数组/字典。在这里再作一层封装。举个简单的例子,假如返回的JSON数据结构如下:
 
  | 
  | 
2.简单业务逻辑封装
- 现在只需要使用到
result数据(并对应CYXMenu模型),在公司中,接口一般会有比较好的规范,即每个接口的模型属性一般都有统一的命名。 - 我们使用时,通常会把
result字典数组转化成CYXMenu模型数组。因此,可以进一步的封装出CYXBaseRequest对象。 CYXBaseRequest类实现思路如下:- 1.使用
CYXHttpRequest发起网络请求,返回数据中取到result - 2.使用
MJExtension将result字典数组转化成CYXMenu模型数组,并返回模型数组 - 3.外界只需要传递进来一个
resultClass即可。 
- 1.使用
 - CYXBaseRequest实现代码如下:
 - CYXBaseRequest.h文件
 
  | 
  | 
- CYXBaseRequest.m文件
 
  | 
  | 
- 到这里,轻量级的封装介绍已经全部介绍完了,更多的功能封装有待读者自己去研究了。既然封装好了,下面我们来介绍一下如何使用,其实非常简单。
 
使用介绍
- 1.把上述两个类的.h  .m 文化拖到您项目中,最好新建一个
文件夹。  - 2.在需要发送请求的Controller中
#import "CYXBaseRequest.h" - 3.发送请求方法中的代码如下:
- (使用CYXBaseRequest):
 
 
  | 
  | 
- 在这里对比一下不使用CYXBaseRequest的发送请求方法代码:
 
  | 
  | 
- 虽然从代码看似两种使用差别不太大(只是少了几行代码),但相比之下,前者确实降低了对AFN等框架的依赖,并省去了每次都手动转一下模型的烦恼,现在你只需要把
resultClass传过去,返回的数据便是已经转化好的模型,并在CYXBaseRequest内打印出请求链接地址,返回数据等有用信息,方便调试,接口设计也类似AFN,使用简便。 
- TIPS:建议使用者可以在每个模块都建立Request文件(继承CYXBaseRequest),统一进行网络请求,这样更方便管理。
 
注:
- 本封装实践只对网络请求进行初步的简单封装,仅适用于中小型的项目,并不涉及缓存、校验等高级功能,如果有高级需求,建议研究下猿题库的YTKNetwork网络库。