本节将对项目分层,对整个项目进行重构,首先对网络请求框架进行重构,封装。
##目前项目存在的问题:
###1、对第三方框架依赖性太强,如AFNetworking\AFN网络请求。### 首页获取数据,发微博,如果AFN升级,新版本更新大或停止维护,那么就会出现问题,如果需要换框架则会很痛苦。 怎么解决该问题呢?经过思索后,我们可以自己封装一个HttpTool工具类,这个工具类专门用来发送网络请求,它把我们用的第三方框架封装起来,下次控制器直接请求HttpTool,如果AFN升级,只需修改HttpTool类即可,这就是分层的好处。
###封装HttpTool网络请求工具类
***IWHttpTool.h ***
//
// IWHttpTool.h
//
// 封装整个项目的GET\POST请求
#import <Foundation/Foundation.h>
@interface IWHttpTool : NSObject
/**
* 发送一个POST请求
*
* @param url 请求路径
* @param params 请求参数
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
*
*/
+ (void)postWithURL:(NSString *)url params:(NSDictionary *)params success:(void(^)(id json))success failure:(void(^)(NSError *error))failure;
@end
**实现方法IWHttpTool.m **
//
// IWHttpTool.m
// ItcastWeibo
// Created by kaiyi on 16-5-29.
#import "IWHttpTool.h"
#import "AFNetworking.h"
@implementation IWHttpTool
+ (void)postWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
// AFNetworking\AFN
// 1.创建请求管理对象
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.发送请求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
if(success){
success(responseObject);
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
if(failure){
failure(error);
}
}];
}
@end
###将项目中使用的AFN网络请求用封装的工具类HttpTool替换
/**
* 通过code换取一个accessToken
redirect_uri true string 回调地址,需需与注册应用里的回调地址一致。
*/
- (void)accessTokenWithCode:(NSString *)code
{
// 1.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"client_id"] = IWAppKey;
params[@"client_secret"] = IWAppSecret;
params[@"grant_type"] = @"authorization_code";
params[@"code"] = code;
params[@"redirect_uri"] = IWRedirectURI;
// =====***HttpTool***========
// 2.发送请求,请求成功后,需要调用这整个successBlock
[IWHttpTool postWithURL:@"https://api.weibo.com/oauth2/access_token" params:params success:^(id json)
{
// 4.先将字典转为模型
IWAccount *account = [IWAccount accountWithDict:json];
// 5.存储模型数据
[IWAccountTool saveAccount:account];
// 6.新特性\去首页
[IWWeiboTool chooseRootController];
// 7.隐藏提醒框
[MBProgressHUD hideHUD];
} failure:^(NSError *error)
{
// 隐藏提醒框
[MBProgressHUD hideHUD];
}];
/*
// AFNetworking\AFN
// 1.创建请求管理对象
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"client_id"] = IWAppKey;
params[@"client_secret"] = IWAppSecret;
params[@"grant_type"] = @"authorization_code";
params[@"code"] = code;
params[@"redirect_uri"] = IWRedirectURI;
// 3.发送请求
[mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 4.先将字典转为模型
IWAccount *account = [IWAccount accountWithDict:responseObject];
// 5.存储模型数据
[IWAccountTool saveAccount:account];
// 6.新特性\去首页
[IWWeiboTool chooseRootController];
// 7.隐藏提醒框
[MBProgressHUD hideHUD];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 隐藏提醒框
[MBProgressHUD hideHUD];
}];
*/
}
##IWHttpTool.m Get请求封装
// IWHttpTool.h
/**
* 发送一个GET请求
*
* @param url 请求路径
* @param params 请求参数
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
*/
+ (void)getWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id json))success failure:(void (^)(NSError *error))failure;
// IWHttpTool.m
+ (void)getWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
// 1.创建请求管理对象
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.发送请求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure) {
failure(error);
}
}];
}
###项目中用IWHttpTool的getWithURL:方法替换原来的get请求
// IWHomeViewController.m
/**
* 获得用户信息
*/
- (void)setupUserData
{
// 1.创建请求管理对象
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"access_token"] = [IWAccountTool account].access_token;
params[@"uid"] = @([IWAccountTool account].uid);
// 3.发送请求***====***
[IWHttpTool getWithURL:@"https://api.weibo.com/2/users/show.json" params:params success:^(id json) {
// 字典转模型
IWUser *user = [IWUser objectWithKeyValues:json];
// 设置标题文字
[self.titleButton setTitle:user.name forState:UIControlStateNormal];
// 保存昵称
IWAccount *account = [IWAccountTool account];
account.name = user.name;
[IWAccountTool saveAccount:account];
} failure:^(NSError *error) {
}];
/*
// 3.发送请求
[mgr GET:@"https://api.weibo.com/2/users/show.json" parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 字典转模型
IWUser *user = [IWUser objectWithKeyValues:responseObject];
// 设置标题文字
[self.titleButton setTitle:user.name forState:UIControlStateNormal];
// 保存昵称
IWAccount *account = [IWAccountTool account];
account.name = user.name;
[IWAccountTool saveAccount:account];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
*/
}
注意:[IWHttpTool getWithURL:@"https://api.weibo.com/2/users/show.json" params:params success:^(id json) {} 中的json为发送请求后返回的数据,因为类型未知,所以这里用id通用类型表示。
来源:oschina
链接:https://my.oschina.net/u/2557944/blog/684511