【实践】使用“Alamofire+HandyJSON+结构体+泛
2017-03-24 本文已影响1655人
SmartisanBool
零:更新2018.5
1.Swift 4.0 引入了一种新的语言特性 Codable,大大提升了对象和其表示之间相互转换的体验,可以参考 https://juejin.im/book/5ad19f07518825364001dd49
2.新增实践文章《在swift中使用枚举统一管理项目Api》https://www.jianshu.com/p/32c99a3aa246
一:工具介绍
1.Alamofire(github地址):已经有篇文章对Alamofire做了详细的分析了(链接地址)
2.HandyJSON(github地址):阿里开源的对实例和JSON相互转化的工具,其实现原理不是基于KVC,因此他不要求实例必须继承自NSObject,也不需要实现mapping方法。HandyJSON目前依赖于从Swift Runtime源码中推断的内存规则,任何变动将随时跟进。
HandyJSON和ObjectMapper(github地址)特性对比:
都支持struct、
都支持序列化和反序列化;
HandyJSON不需要实现mapping方法,ObjectMapper需要;
HandyJSON支持类型自适应,ObjectMapper不支持;
HandyJSON支持enum;
....
3.model采用结构体而非类。在 Swift 标准库中,大约百分之九十的公开的类型都是结构体,具体关于结构体和类的区别将在《swift 进阶》结构体和类中进行学习。
二:框架搭建
1.声明model
import HandyJSON
struct UpdateInfo : HandyJSON{
var updateContent: String?
var targetVersionNum: String?
var updateUrl: String?
}
2.声明网络请求函数
/// 网络请求方法
///
/// - parameter paramters: 参数
/// - parameter requestApi: 接口Api
/// - parameter finished: 闭包
///
func sendNetworkRequest<T:HandyJSON>(_ paramters: [String : String],requestApi:String,finished:@escaping (_ responseModel: T,_ error: Error?)->()){
Alamofire.request(BASE_URL, method: .post, parameters: getBaseParamters(paramters, requestCode: requestApi)).responseString { response in
if response.result.isSuccess{
if let responseObject = T.deserialize(from: response.result.value) {
finished(responseObject,nil)
}else{
finished(T(),PXFError.deserialize_Error(response.result.value))
}
}else{
finished(T(),response.result.error)
}
}
}
3.发起网络请求
@objc func requestUpdate(){
var paramters = [String : String]()
paramters["current_version_num"] = APP_VERSION_CODE
NetworkTool.sharedInstance.sendNetworkRequest(paramters, requestApi: VERSION_UPDATE_API) { (updateInfo:UpdateInfo, error) in
if error == nil{
ALinLog(error)
}else{
ALinLog(updateInfo)
}
}
}
4.实现Error的枚举类型
public enum PXFError: Error {
case deserialize_Error(String?)
}