本节将对项目分层,对整个项目进行重构,首先对网络请求框架进行重构,封装。
##目前项目存在的问题:
###1、对第三方框架依赖性太强,如AFNetworking\AFN网络请求。### 首页获取数据,发微博,如果AFN升级,新版本更新大或停止维护,那么就会出现问题,如果需要换框架则会很痛苦。 怎么解决该问题呢?经过思索后,我们可以自己封装一个HttpTool工具类,这个工具类专门用来发送网络请求,它把我们用的第三方框架封装起来,下次控制器直接请求HttpTool,如果AFN升级,只需修改HttpTool类即可,这就是分层的好处。
###封装HttpTool网络请求工具类
***IWHttpTool.h ***
//// IWHttpTool.h//// 封装整个项目的GET\POST请求#import@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:@"" params:params success:^(id json) {} 中的json为发送请求后返回的数据,因为类型未知,所以这里用id通用类型表示。