这里主要介绍了swift4版本的网络请求,封装中带有Progress及错误信息处理,缓存等的统一解决方案
简书地址https://www.jianshu.com/p/caa1a57e7423
Codable
增加跨类型解析方式:感谢hhfa008大神提供的方式
后台最常用的类型,也是最容易让我们出错的就是Int
和String
类型的不确定,
这里提供了后台同一个字段返回类型Int
和String
不确定时的解析方式,
可自行增加Bool
类型等。
自定义解析类型如下,示例见demo
///跨类型解析方式
// 一个含有int,string的类,可用于解析后台返回类型不确定的字段。即:把int\string解析成TStrInt且解析后TStrInt的int和string都有值
//----- 使用时如果报未初始化的错误,而且找不到原因时,可以尝试先修复model以外的错误,也许这个错误就会消失。。。。 这是编译器提示错误的原因
struct TStrInt: Codable {
var int:Int {
didSet {
let stringValue = String(int)
if stringValue != string {
string = stringValue
}
}
}
var string:String {
didSet {
if let intValue = Int(string), intValue != int {
int = intValue
}
}
}
init(from decoder: Decoder) throws {
let singleValueContainer = try decoder.singleValueContainer()
if let stringValue = try? singleValueContainer.decode(String.self)
{
string = stringValue
int = Int(stringValue) ?? 0
} else if let intValue = try? singleValueContainer.decode(Int.self)
{
int = intValue
string = String(intValue);
} else {
int = 0
string = ""
}
}
}
请求均采用 Alamofire
请求封装方式分为:
- 1.Moya(一个star很多的
Alamofire
的上层封装,为本demo推荐方式。我在使用过程中发现moya是极其优美的网络请求方式) - 2.链式请求(如果你刚刚从OC转到swift,可能还不适应moya的方式,那么也可以用这种请求方式)
- 3.仿AFN式请求(这应该是OC中常见的封装方式)
加载动画及弹出框采用 MBProgressHUD
在swift4之前,我一直用的是HandyJSON
(下面有介绍)。在swift4之后我把model的解析转到到官方的Codable。
缓存部分没有接入数据库,而是直接用了write to file
,并将缓存封装到网络请求方法中
本demo内容可直接用于项目开发
Alamofire:Swift中著名的网络请求库
Moya:著名的Alamofire封装,让网络请求看起来更加的优美,更有利于阅读与迭代
MBProgressHUD: 进度条,弹出框,OC写的库
Kingfisher: 加载网络图片,类似SDWebImage
已弃用
HandyJSON 是阿里巴巴开源的model的映射库。使用方式类似OC中的MJExtention
ObjectMapper:json解析库,需要手动写映射关系
具体可以看在Swift语言中处理JSON - 转换JSON和Model
接口:http://app.u17.com/v3/appV3_3/ios/phone/rank/list
返回实例:
{
"code": 1,
"data": {
"stateCode": 1,
"message": "成功",
"returnData": {
"rankinglist": [
{
"title": "月票",
"subTitle": "来不及了快上车,老司机票选人气漫画,带你飞!",
"cover": "http://image.mylife.u17t.com/2016/12/28/1482920243_f2kF1UculvH7.jpg",
"argName": "sort",
"argValue": "23",
"rankingType": "月票值"
},
{
"title": "点击",
"subTitle": "厉害了我的大触,原来大家都在这里看漫画!?",
"cover": "http://image.mylife.u17t.com/2016/12/28/1482920257_yznXvXJcrvk8.jpg",
"argName": "sort",
"argValue": "25",
"rankingType": "点击值"
},
{
"title": "吐槽",
"subTitle": "不可描述的吐槽,画面太美,快来看看。",
"cover": "http://image.mylife.u17t.com/2016/12/28/1482920418_vA222B8m6qi3.jpg",
"argName": "sort",
"argValue": "20",
"rankingType": "吐槽值"
},
{
"title": "新作",
"subTitle": "拒绝身体被掏空,人气新作为你补补血。",
"cover": "http://image.mylife.u17t.com/2016/12/28/1482920437_Cmg3we0vH3me.jpg",
"argName": "topic",
"argValue": "16",
"rankingType": "新作值"
}
]
}
}
}
希望能达到抛砖引玉的效果
也给新学习swift的朋友一个简单的网络处理的方式
大家互相帮助,互相学习
- 链式请求可以只组合需要的函数,本身默认为常用方式,简化常用的链式调用
- 对于非默认值的请求可以自定义进行设置
- 方便添加自定义行为,利于扩展
- 利于OC转swift的同学学习
- 其中对返回值做了JSON和String两种解析,String是为了方便实用HandyJSON,不使用HandyJSON可以自行删除部分代码