iOS的網(wǎng)絡(luò)框架(HTNetWork)設(shè)計(jì)

背景和目的

目前iOS框架中網(wǎng)絡(luò)的實(shí)現(xiàn)方式大多基于流行的網(wǎng)絡(luò)框架進(jìn)行例如ASI、AFNetWork等)或者蘋果自帶的NSURLSession。ASI是基于CFHTTP的,AFNetworking是基于NSURL的,兩者處在不同的層次上,實(shí)現(xiàn)原理也不同。

如何在開發(fā)自己的項(xiàng)目過程中提供一套最簡單的API,只需提供我們用的到的接口,并且將一些重復(fù)的處理邏輯封裝起來。使得調(diào)用者在不需要了解到具體使用何種網(wǎng)絡(luò)庫 CFHTTP、NSURL、ASIHTTPRequest、AFNetworking的情況下,就能把網(wǎng)絡(luò)請求處理完,讓開發(fā)著處理網(wǎng) 絡(luò)請求像調(diào)用本地方法一樣自然,這就是本次設(shè)計(jì)的目的。

需要解決的問題

1.調(diào)用方式簡單明確

減少使用者對具體的網(wǎng)絡(luò)框架的依賴,按照統(tǒng)一的方式進(jìn)行調(diào)用,便于規(guī)范代碼書寫和后續(xù)維護(hù)。

2.解決網(wǎng)絡(luò)數(shù)據(jù)和業(yè)務(wù)層的對接問題

返回?cái)?shù)據(jù)形式是NSDictionary,在model基類中通過runtime方式將其轉(zhuǎn)換為具體的model對象。

3.業(yè)務(wù)層獲得數(shù)據(jù)的形式

業(yè)務(wù)層直接對具體的model進(jìn)行處理和顯示。為了減少業(yè)務(wù)層處理邏輯建議server端返回?cái)?shù)據(jù)形式盡可能和APP的UI表示邏輯保持一致。

4.封裝API應(yīng)該是集約型還是離散型

所謂集約型,就是只能業(yè)務(wù)層提供一個(gè)方法,所有業(yè)務(wù)層的網(wǎng)絡(luò)請求都要通過該方法完成。集約型的好處是對于網(wǎng)絡(luò)層的編寫來說方便快捷,對業(yè)務(wù)的適用性較強(qiáng)。
離散型就是根據(jù)功能模塊分為不同的模塊,分別提供不同的方法給業(yè)務(wù)層調(diào)用。離散型便于理解,項(xiàng)目結(jié)構(gòu)更清晰同時(shí)要求對業(yè)務(wù)具有較好的抽象能力。

本次設(shè)計(jì)采用集約型的方式進(jìn)行主要出于以下幾點(diǎn)考慮:
1.server支持的數(shù)據(jù)結(jié)構(gòu)貼近UI設(shè)計(jì),后續(xù)需要處理加工較少。
2.APP整體架構(gòu)設(shè)計(jì)時(shí)已經(jīng)對Control層進(jìn)行了擴(kuò)展,網(wǎng)絡(luò)訪問再使用離散型略顯啰嗦和導(dǎo)致代碼過于分散。

網(wǎng)絡(luò)架構(gòu)需要具備如下功能

1.支持緩存網(wǎng)絡(luò)請求內(nèi)容
2.支持統(tǒng)一設(shè)置服務(wù)器地址
3.支持檢查返回Json數(shù)據(jù)的合法性
4.支持block和delegate兩種模式的回調(diào)方式
5.支持批量的網(wǎng)絡(luò)請求,并統(tǒng)一設(shè)置它們的回調(diào)
6.支持網(wǎng)絡(luò)請求URL的filter,可以統(tǒng)一為網(wǎng)絡(luò)請求加上一些參數(shù),或者修改一些路徑。

網(wǎng)絡(luò)架構(gòu)圖

ar.png

UML設(shè)計(jì)

UML.png

最終實(shí)現(xiàn)

1.HTRequestConfig:負(fù)責(zé)配置統(tǒng)一服務(wù)器地址和為網(wǎng)絡(luò)請求加上一些參數(shù)(Token,Sig等),可同時(shí)為多個(gè)Request提供配置
2.HTRequest:基本的請求對象,請求的URL、參數(shù)、body數(shù)據(jù)體和請求的方法(Get、Post)
3.HTReponse:請求的返回?cái)?shù)據(jù)
4.HTNetWorkError:返回錯(cuò)誤信息
5.HTDataCache:數(shù)據(jù)緩存和讀取

類實(shí)現(xiàn)

HTRequestConfig

#import <Foundation/Foundation.h> @interface HTRequestConfig : NSObject @property (nonatomic,retain) NSString *baseUrl; @property (nonatomic,retain) NSString *token; @property (nonatomic,retain) NSString *sig; @property (nonatomic,retain) NSString *timestamp; @end

HTRequest

HTRequest通過其類方法進(jìn)行構(gòu)造,對外屬性均為只讀。其中tag用于批量請求時(shí)進(jìn)行區(qū)分。
#import "HTRequestConfig.h" typedef NS_ENUM(NSInteger, RequestMethod) { RequestMethod_Get = 0, RequestMethod_Post, RequestMethod_Put, RequestMethod_Delete };
@interface HTRequest : NSObject @property (readonly,nonatomic,copy) NSURL* url; @property (readonly,nonatomic,copy) NSString* fullPath; @property (readonly,nonatomic,copy) NSDictionary* parameters; @property (readonly,nonatomic,copy) NSData* data; @property (readonly,nonatomic)RequestMethod methodType; @property (nonatomic,retain)NSString *tag;
+ (instancetype)sharedRequestWithMethodType:(RequestMethod)methodType withPath:(NSString *)path withParam:(NSDictionary *)paramDic withConfig:(HTRequestConfig *)config;
+ (instancetype)sharedRequestWithData:(NSData *)data withPath:(NSString *)path withParam:(NSDictionary *)paramDic withConfig:(HTRequestConfig *)config; @end

HTNetWorkClient

HTNetWorkClient中集約所有訪問方法,包括單個(gè)和批量請求、數(shù)據(jù)上傳(圖片、音頻、視頻)支持block和delegate兩種模式的回調(diào)方式。
1.屬性defaultCheckMessage用于檢查json的合法性。在和Server端通信設(shè)計(jì)中規(guī)定所有Json的格式按照(MessageCode、Message、data)的形式進(jìn)行,messageCode非0的場合數(shù)據(jù)請求失敗。
2.屬性defaultUseCache用于設(shè)置和判斷是否有數(shù)據(jù)緩存,如果要使用緩存數(shù)據(jù)通過getCacheData進(jìn)行取得。

@interface HTNetWorkClient : NSObject{ AFHTTPSessionManager *_requestManager; NSInteger _bacthRequestCount; HTResponse *_batchResponse; }
@property (nonatomic,weak) id<HTRequestDelegate> delegate; @property (nonatomic)BOOL defaultCheckMessage; @property (nonatomic)BOOL defaultUseCache;
+ (instancetype)sharedClient;
- (void)startAsynchronous:(HTRequest *)request;
- (void)startAsynchronous:(HTRequest*)request onProgress:(HITResponseProgress)progressBlock onResponse:(HITResponseObject)responseBlock onError:(HITResponseError)errorBlock;
- (void)startAsynchronousWithBatchRequest:(NSArray *)batchRequest;
- (void)startAsynchronousWithBatchRequest:(NSArray *)batchRequest onProgress:(HITResponseProgress)progressBlock onResponse:(HITResponseObject)responseBlock onError:(HITResponseError)errorBlock;
- (void)startUploadData:(HTRequest *)request withDataType:(DataType)dataType;
- (void)startUploadData:(HTRequest *)request withDataType:(DataType)dataType onProgress:(HITResponseProgress)progressBlock onResponse:(HITResponseObject)responseBlock onError:(HITResponseError)errorBlock;

- (void)cancel;
- (id)getCacheData:(HTRequest *)request;
@end

HTNetWorkError

封裝錯(cuò)誤信息,無論請求是否正常json中messageCode不等于0即為失敗。
@interface HTNetWorkError : NSObject
@property (nonatomic,assign) NSInteger errorCode;
@property (nonatomic,copy) NSString *errorDescription;
@end

HTDataCache

按照訪問的url為key進(jìn)行數(shù)據(jù)緩存。
@interface HTDataCache : NSObject{ NSCache *_cache; }
+ (HTDataCache *)sharedManager;
- (void)cacheDataWithUrl:(NSString *)url withData:(id)jsonData;
- (id)getCacheDataWithUrl:(NSString *)url;

@end

HTResponse

封裝了請求的返回?cái)?shù)據(jù),有多個(gè)請求時(shí)以請求的tag作為key。
@interface HTResponse : NSObject{ NSMutableDictionary *_responseObjectDic; }
@property (readonly,nonatomic,strong)id object;
@property (readonly,nonatomic,strong)NSDictionary *objectDic;
+ (HTResponse*)shareResponseWithObject:(id)responseObject;
- (void)setObjectByKey:(NSString *)key withObject:(id)responseObject;
- (id)getObjectByKey:(NSString *)key;
@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評(píng)論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容