iOS的网络框架(HTNetWork)设计

背景和目的

目前iOS框架中网络的实现方式大多基于流行的网络框架进行例如ASI、AFNetWork等)或者苹果自带的NSURLSession。ASI是基于CFHTTP的,AFNetworking是基于NSURL的,两者处在不同的层次上,实现原理也不同。

如何在开发自己的项目过程中提供一套最简单的API,只需提供我们用的到的接口,并且将一些重复的处理逻辑封装起来。使得调用者在不需要了解到具体使用何种网络库 CFHTTP、NSURL、ASIHTTPRequest、AFNetworking的情况下,就能把网络请求处理完,让开发着处理网 络请求像调用本地方法一样自然,这就是本次设计的目的。

需要解决的问题

1.调用方式简单明确

减少使用者对具体的网络框架的依赖,按照统一的方式进行调用,便于规范代码书写和后续维护。

2.解决网络数据和业务层的对接问题

返回数据形式是NSDictionary,在model基类中通过runtime方式将其转换为具体的model对象。

3.业务层获得数据的形式

业务层直接对具体的model进行处理和显示。为了减少业务层处理逻辑建议server端返回数据形式尽可能和APP的UI表示逻辑保持一致。

4.封装API应该是集约型还是离散型

所谓集约型,就是只能业务层提供一个方法,所有业务层的网络请求都要通过该方法完成。集约型的好处是对于网络层的编写来说方便快捷,对业务的适用性较强。
离散型就是根据功能模块分为不同的模块,分别提供不同的方法给业务层调用。离散型便于理解,项目结构更清晰同时要求对业务具有较好的抽象能力。

本次设计采用集约型的方式进行主要出于以下几点考虑:
1.server支持的数据结构贴近UI设计,后续需要处理加工较少。
2.APP整体架构设计时已经对Control层进行了扩展,网络访问再使用离散型略显啰嗦和导致代码过于分散。

网络架构需要具备如下功能

1.支持缓存网络请求内容
2.支持统一设置服务器地址
3.支持检查返回Json数据的合法性
4.支持block和delegate两种模式的回调方式
5.支持批量的网络请求,并统一设置它们的回调
6.支持网络请求URL的filter,可以统一为网络请求加上一些参数,或者修改一些路径。

网络架构图

ar.png

UML设计

UML.png

最终实现

1.HTRequestConfig:负责配置统一服务器地址和为网络请求加上一些参数(Token,Sig等),可同时为多个Request提供配置
2.HTRequest:基本的请求对象,请求的URL、参数、body数据体和请求的方法(Get、Post)
3.HTReponse:请求的返回数据
4.HTNetWorkError:返回错误信息
5.HTDataCache:数据缓存和读取

类实现

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通过其类方法进行构造,对外属性均为只读。其中tag用于批量请求时进行区分。
#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中集约所有访问方法,包括单个和批量请求、数据上传(图片、音频、视频)支持block和delegate两种模式的回调方式。
1.属性defaultCheckMessage用于检查json的合法性。在和Server端通信设计中规定所有Json的格式按照(MessageCode、Message、data)的形式进行,messageCode非0的场合数据请求失败。
2.属性defaultUseCache用于设置和判断是否有数据缓存,如果要使用缓存数据通过getCacheData进行取得。

@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

封装错误信息,无论请求是否正常json中messageCode不等于0即为失败。
@interface HTNetWorkError : NSObject
@property (nonatomic,assign) NSInteger errorCode;
@property (nonatomic,copy) NSString *errorDescription;
@end

HTDataCache

按照访问的url为key进行数据缓存。
@interface HTDataCache : NSObject{ NSCache *_cache; }
+ (HTDataCache *)sharedManager;
- (void)cacheDataWithUrl:(NSString *)url withData:(id)jsonData;
- (id)getCacheDataWithUrl:(NSString *)url;

@end

HTResponse

封装了请求的返回数据,有多个请求时以请求的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容