上一節對網絡請求作了封裝,可是仍是存在一些問題,本節將對項目的業務邏輯進行重構。json
#爲什麼須要重構? ##第一個問題 上一節對網絡請求作了封裝,可是仍是存在一些問題,咱們能夠看看首頁,每個方法都作具體的業務邏輯,如獲取用戶信息,控制器太關注業務信息了,如控制器對請求的URL知道的太清楚,GET:@"https://api.weibo.com/2/users/show.json" parameters:params,咱們但願控制器不用太關注URL,若是之後該URL改變了,其餘地方也在用,那麼之後修改起來特別麻煩。api
##第二個問題 咱們如今是面向字典開發,這樣有一個問題,就是字典的Key很容易寫錯。緩存
// 2.封裝請求參數 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"access_token"] = [IWAccountTool account].access_token;
還有,以下面這個方法,加載首頁的數據方法,須要傳一個字典類型的參數,可是經過這個字典咱們不清楚字典裏邊應該放那些Key,放什麼東東,不是很清楚,沒有將業務邏輯描述很清楚,別人要使用你的方法,會一頭霧水,因此這個方法寫的很失敗。那應該怎樣處理呢?我以爲應該面向模型,用模型類封裝這些屬性。網絡
+ (void)homeStatusesWithParams:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure;
###解決方法: ####在首頁的Model目錄下建立首頁數據模型類 IWHomeStatusParam.h 工具
// // IWHomeStatusParam.h // ItcastWeibo // Created by kaiyi on 16-6-3. // Copyright (c) 2016年 itcast. All rights reserved. // // 封裝加載首頁微博數據的參數 #import <Foundation/Foundation.h> @interface IWHomeStatusParam : NSObject // 受權token @property (nonatomic, copy) NSString *access_token; // 返回ID比since_id大的微博 @property (nonatomic, assign) long long since_id; @end
###而後在Home(首頁)/Tool/IWStatusTool.h文件中引入該模型類atom
// // IWStatusTool.h // ItcastWeibo // // Created by kaiyi on 16-6-3. // Copyright (c) 2016年 itcast. All rights reserved. //// 業務處理類(工具類) #import <Foundation/Foundation.h> @class IWHomeStatusParam; // ********引入數據模型類******* @interface IWStatusTool : NSObject // 新的傳入模型參數方法 + (void)homeStatusesWithParam:(IWHomeStatusParam *)param success:(void (^)(id))success failure:(void (^)(NSError *))failure; @end // 舊的字典參數方法 // + (void)homeStatusesWithParams:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure;
從以上的封裝能夠看出,模型類參數比字典參數更容易讓人懂,由於咱們能夠根據參數的模型類型,直接找到源文件的封裝的參數的屬性。code
##第三個問題 首頁獲取網絡數據,經過咱們以前封裝的HttpTool網絡工具發送http請求,若是後邊咱們須要添加本地緩存,即當用戶下次進入到App後,先是從本地緩存的沙盒加載數據,而後再從網絡請求數據,這樣須要怎麼處理呢?很顯然,以前封裝的層級關係已經不能適用了。 token
首頁要顯示微博數據,有兩種可能,第一種從本地緩存沙盒種獲取數據,若是本地沒有,則發送網絡請求獲取數據,因此,這裏就不必定利用HttpTool加載數據(如上圖的業務邏輯),咱們能夠假設有一個沙盒工具類 shaheTool,則首頁加載數據就須要使用兩個工具類,HttpTool和shaheTool,以下圖:圖片
首頁展現微博數據,須要經過兩個工具類,若是還有第3、四種可能,那麼邏輯就很複雜也很混亂,業務邏輯就會常常的改,那麼該如何處理呢?開發
爲了讓控制器受到最小傷害,咱們能夠再搞一個工具類IWStatusTool,用該工具類屏蔽業務細節,之後到底是從沙盒或網絡獲取數據,能夠經過該業務工具類來選擇獲取,控制器不須要關心;這樣作的另外一個好處就是,若是之後某個業務的具體功能改了,也不會影響控制器。
###工具類用途: ####IWStatusTool:業務工具類,即用來完成功能或業務的工具類,屏蔽業務實現細節。 ####IWHttpTool:通用工具類,用來完成某種通用的技術,如網絡請求。