Moya集锦(续)
2020-05-18 本文已影响0人
coenen
上篇文章已经说了一些基本的封装,这次把我们上篇的预留坑给填一下.
先回顾一下我们上篇的预留坑位-“本地采用的时候传递了一个targetName,这个是做后续扩展使用的”
这个targetName就是大家想到的Model.根据网络请求的数据,自动采用映射生成model.这样降低了大家的使用成本.
简单的改动比如最底层的数据处理
由:
dealResult(targetName: String,result: Result<Response, MoyaError>, successClosure:((_ result: Any) -> ())? = nil, failureClosure:((_ errorCode: Int, _ errorMessage: String) ->())? = nil)
修改为:
dealWithResult<Model: LTMModel>(targetName: Model,result: Result<Response, MoyaError>, successClosure:((_ result: Any) -> ())? = nil, failureClosure:((_ errorCode: Int, _ errorMessage: String) ->())? = nil)
没错,重点就在这儿, targetName: String -> <Model: LTMModel>(targetName: Model 的转变
最终的数据处理如下:
func success200DealWtih<Model: LTMModel>(response: [String : Any], targetName: Model) -> Any{
let resultModel = Model.deserialize(from: response)
return resultModel ?? NSObject()
}
那么这个LTMModel 是什么呢?根本就是一个转换协议.
public protocol LTMModel: HandyJSON{
}
继承自 HandyJSON 协议.为什么要多加这一道工序呢?
其实就是为了隔离代码侵入.比如以后想采用别的模型转换,或者更好的处理方式.只用修改该地方即可.防止出现修改一大堆的代码.
在Provider中也需要遵从该协议
public func merchantLoginModuleRequest<Model: LTMModel>(target: LTMMoyaLoginApiService, targetName: Model, successClosure:((_ result: Any) -> ())? = nil, failureClosure:((_ errorCode: Int, _ errorMessage: String) ->())? = nil)
说一千道一万,不如Demo转一转.
希望大家喜欢哈.