博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS博客项目搭建-18-项目分层思想
阅读量:2384 次
发布时间:2019-05-10

本文共 5874 字,大约阅读时间需要 19 分钟。

本节将对项目分层,对整个项目进行重构,首先对网络请求框架进行重构,封装。

##目前项目存在的问题:

###1、对第三方框架依赖性太强,如AFNetworking\AFN网络请求。### 首页获取数据,发微博,如果AFN升级,新版本更新大或停止维护,那么就会出现问题,如果需要换框架则会很痛苦。 怎么解决该问题呢?经过思索后,我们可以自己封装一个HttpTool工具类,这个工具类专门用来发送网络请求,它把我们用的第三方框架封装起来,下次控制器直接请求HttpTool,如果AFN升级,只需修改HttpTool类即可,这就是分层的好处。

AFN

###封装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通用类型表示。

转载于:https://my.oschina.net/corwien/blog/684511

你可能感兴趣的文章
Linux下的内网反弹实例
查看>>
Apache 漏洞之后缀名解析漏洞
查看>>
Sun Java Web Server version 7.0 update 7 remote stack overflow exploit
查看>>
Command execution with a MySQL UDF
查看>>
more with rpcclient
查看>>
ITIL项目手记四:证券公司ITIL项目的心得
查看>>
WINDOWS下搭建LDAP服务器
查看>>
二进制数据 + MySQL + PHP 怎样在Mysql中直接储存图片
查看>>
For Linux Mysql Udf
查看>>
Perl BackConnectShell + Rootlab t00l
查看>>
JBoss Autopwn Script
查看>>
OTPs: Using s/Key with SSH via OPIE
查看>>
使用arpwatch和arping来排查ARP攻击
查看>>
Linux硬件监控方法
查看>>
Linux系统安全工具之:Sxid和Skey
查看>>
arp工具简介_arptables_arpwatch
查看>>
linux core dump 知识整理
查看>>
RPM 校验软件包完整性
查看>>
OSSEC错误解决
查看>>
RSA SecurID Authentication linux sshd PAM deploy
查看>>