美文网首页swiftSwift开发实战swift开发技巧
【实践】使用“Alamofire+HandyJSON+结构体+泛

【实践】使用“Alamofire+HandyJSON+结构体+泛

作者: SmartisanBool | 来源:发表于2017-03-24 18:10 被阅读1655次

零:更新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?)
  }

相关文章

网友评论

  • 陈水寒:你好,我想问下responseString返回的response.result.value中含有中文,打印出来都是乱码,怎么解决啊。。GitHub上没有找到解决方法
  • 梁森的简书:SwiftJSON是用来将JSON数据转成对象的(字典或数组)。 HandleJSON能将字典转成模型? 是这么个理吗?
    栋柠柒:@妖妖零幺幺 不是继承,是实现协议
    妖妖零幺幺:@梁森森 HandleJSON 需要被继承 耦合性有点大啊
  • 独白melody:是 if error != nil 哈哈
  • Rayman_智:如果要返回 array 类型的数据怎么办呢?
  • c8bca729db18:有具体的demo连接地址吗?
    c8bca729db18:@SmartisanBool 已经处理完了
    SmartisanBool:这个没有整理:joy:
  • 葱花饼:你好,为什么我集成HandyJSON就报错
    葱花饼:@SmartisanBool 你是直接下载本地拖进项目的吗
    SmartisanBool:@葱花饼 好奇怪:sweat:时通过pod管理的么
    葱花饼:Command/Desktop/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1
  • 贝尔特伦:传说中的美女程序员😀

本文标题:【实践】使用“Alamofire+HandyJSON+结构体+泛

本文链接:https://www.haomeiwen.com/subject/iezxottx.html