本节将对项目分层,对整个项目进行重构,首先对网络请求框架进行重构,封装。json
##目前项目存在的问题:api
###一、对第三方框架依赖性太强,如AFNetworking\AFN网络请求。### 首页获取数据,发微博,若是AFN升级,新版本更新大或中止维护,那么就会出现问题,若是须要换框架则会很痛苦。 怎么解决该问题呢?通过思索后,咱们能够本身封装一个HttpTool工具类,这个工具类专门用来发送网络请求,它把咱们用的第三方框架封装起来,下次控制器直接请求HttpTool,若是AFN升级,只需修改HttpTool类便可,这就是分层的好处。网络
###封装HttpTool网络请求工具类框架
***IWHttpTool.h ***ide
// // 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替换post
/** * 经过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请求封装ui
// 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请求url
// 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通用类型表示。code