IOS博客项目搭建-18-项目分层思想

房东的猫 提交于 2019-11-27 03:27:16

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

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

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

AFN

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!