swiftSwift开发实战swift开发技巧

【实践】使用“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?)
  }
上一篇 下一篇

猜你喜欢

热点阅读