三方库Swift

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转一转.
希望大家喜欢哈.

上一篇 下一篇

猜你喜欢

热点阅读