实际的项目,我们所请求的API返回的JSON数据都是一个统一的格式,我们就定为如下的格式来现实我们NetworkAPI:
{
"res_code": 1, // 状态码
"res_info": "", //提示消息
"result": { } // result: 1、任何数据类型、2、对象类型、3、对象数组类型
}
我们所用的Alamofire可以处理任何数据类型,而AlamofireObjectMapper的responseObject和responseArray方法可以直接把result数据转化为Model或Model数组,但是它们不能满足我们需要,所以我们要在它们的基本上进一步做处理来现实我们的需求,我们针对result返回的三种数据类型定义如下的网络请求方法:
1)、任何数据类型的网络接口的定义
2)、对象类型的网络接口的定义
3)、对象数组类型的网络接口的定义
从上面的方法我们可以看到NetworkError,这个就是我们对res_code、res_info数据处理的实现,NetworkError具体如下:
接下来,我们要现实的是上面定义的三个方法,我们结合api返回的数据,对它们做一个统一的处理,具体如下:
其中,用到resMapper是NetworkAPI的一个属性,如下:
fileprivate var resMapper =ResponseMapper()
struct ResponseMapper {
var resultKey:String="result"
var opCodeKey:String="res_code"
var resInfoKey:String="res_info"
}
而,value(keypath:)是一个方法,如下:
fileprivate func value(_keyPath: String?) ->String{
guard let val = keyPath, !val.isEmpty else{
return self.resMapper.resultKey
}
return self.resMapper.resultKey + ".\(val)"
}
然后,我们再来实现上面的三个方法,如下:
从上面来看,我们并没有看到与reactivecocoa的相关影子呢?
没错,它们只是我们后续要实现的准备工作,我们要在它们的基础上进一步实现三个具备RAC(ReactiveCocoa)特性的方法,如下:
RAC的实现,才是我们后续真正要用的网络请求方法,尽请期待!