JNetwork
封装网络通信的必要性,对于一般应用封装下第三方的网络库,提供常用的POST和GET方法,然后Callback给调用者,可以满足一般的情况,但是随着业务发展,用户量的增长,给网络通信提出更多的要求,比如:改进网络通信的性能,网络通信的安全,以及网络封装的灵活性...基于这些要求所有我们有必要封装一个网络通信的模块,它的目的要解决我们常见问题,也要满足某些请求特殊性,所以我列出以下问题需要解决:
架构
JJAPIRequest
每个请求的基本单位,每个网络请求必须是继承这个对象,并实现JJRequestProtocol,才能正常工作,代码示例
网络请求的必要信息
这里是指网络请求的一些必要信息,最少是需要URL的,默认的HTTP Method是GET,其他都是可选的
缓存的策略选择
每个Request可以选择自己对应的缓存策略,由于是Protocol的设计,开发者可以根据自己的逻辑来选择,现在暂时只提供三种策略:
/**
Request support the cache feature,default will request network immediately
do not need cache.
- ReloadFromNetwork: Default mode,request from network
- ReloadFromCacheElseLoadNetwork: If have cache,will return the cache,do not request network,if not exist cache,will load origin source
- ReloadFromCacheTimeLimit: First time load request origin source,save the cache for the limit time,if expire,will load origin source and replace the old cache
*/
typedef NS_ENUM(NSUInteger,HTTPCachePolicy){
ReloadFromNetwork,
ReloadFromCacheElseLoadNetwork,
ReloadFromCacheTimeLimit,
};
最后强调一点就是JJNetwork的Cache支持POST和Get的,iOS自带的CachePolicy只支持GET,因为JJNetwork设计之初就是为接口请求设计的,所以文件上传和下载不在我们功能之内
以及后期的扩展
目前为止,只给Request基础的功能,后续在Request添加各项属性和方法来满足多变业务的需求
JJAPIService
JJAPIService是整个JJNetwork的核心和入口,网络的请求都是由这个地方发送出去的,从层次的角度来说,这里就是App的网络数据提供层,代码示例
使用方式的选择:Category or Extend
使用Extend的好处是:编译期间,可以使用自定义变量,对于开发者来说比较灵活 坏处是:侵入性太强
使用Category的好处是:运行时,按需加载,不破坏原来的结构扩展 坏处是:写自定义变量不方便(技术上做的到),方法名重复问题
在这个选择上,我选择了继承(extend)这种方式,主要是考虑开发者使用的灵活,以及不受方法名约束的问题
方法名表达具体意思
在这个地方是我要坚持的地方,当我们继承于JJAPIService,我们需要一个自定义的方法来表达我的请求是要干什么,需要传递什么参数,具体达到什么功能用方法名来体现,所以这个方式给维护者来说很明确,使用者看到这个类和方法,很快的清晰知道了Service的作用
拦截器的使用
这是JJNetwork的高级功能,有两种方式使用这个功能,使用JJAPISer
作者:jezz
链接:http://www.jianshu.com/p/9a5b4dd8378e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。