Swift5.0的网络请求与数据解析

封装了moya,链式,类AFN式请求

SwiftHttpRequest Github地址

在线转model工具

更新说明:

version 2.1:

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 = ""
        }
    }
}

Demo说明

Demo主要介绍Swift的网络部分,代码已更新到swift4

一. 网络部分

请求均采用 Alamofire

请求封装方式分为:

  • 1.Moya(一个star很多的Alamofire的上层封装,为本demo推荐方式。我在使用过程中发现moya是极其优美的网络请求方式)
  • 2.链式请求(如果你刚刚从OC转到swift,可能还不适应moya的方式,那么也可以用这种请求方式)
  • 3.仿AFN式请求(这应该是OC中常见的封装方式)

二. Progress及信息处理

加载动画及弹出框采用 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

接口说明

本demo使用接口为多米音乐接口
http://v5.pc.duomi.com/search-ajaxsearch-searchall?kw=关键字&pi=页码&pz=每页音乐数
请求数据参数:kw=像我这样的人&pi=1&pz=1

返回实例:

{
"album_offset": 0,
"albums": [
{
"artists": [
{
"id": 61799986,
"name": "Mc名决",
"portrait": null,
"valid": false
}
],
"available": true,
"company": "",
"cover": "http://pic.cdn.duomi.com/imageproxy2/dimgm/scaleImage?url=http://img.kxting.cn//p1/08/16/72494779.jpg&w=150&h=150&s=100&c=0&o=0&m=",
"id": 2742662,
"name": "像我这样的人",
"num_tracks": 4,
"release_date": "2017-08-22",
"type": "EP/单曲"
}
],
"artist_offset": 0,
"artists": null,
"dm_error": 0,
"error_msg": "操作成功",
"recommend": 0,
"total_albums": 1,
"total_artists": 0,
"total_tracks": 6,
"track_offset": 0,
"tracks": [
{
"album": {
"cover": "/p1/12/17/72493295.jpg",
"id": 2741390,
"name": "裙娣"
},
"artists": [
{
"id": 61792091,
"name": "DJ马哥",
"num_albums": 35,
"num_tracks": 233,
"portrait": "",
"valid": false
}
],
"availability": "1110",
"dlyric": "",
"id": 28136457,
"medias": [
{
"bitrate": 320,
"p2purl": "1A4DF5035CE09DB8DF0500000060CFABAC000000A9.mp3"
}
],
"mv": 0,
"slyric": "",
"title": "像我这样的人",
"isdown": "1",
"isplay": "1"
}
]
}

作者语:

希望能达到抛砖引玉的效果

也给新学习swift的朋友一个简单的网络处理的方式

大家互相帮助,互相学习

如果对你有帮助还请给个Star,谢谢🙏

版本:

2.1 Codable跨类型解析:Int解析成StringString解析成Int

2.0 更新到swift4,重新整理代码

1.2 新增moya的demo

1.1 新增链式请求的封装

  • 链式请求可以只组合需要的函数,本身默认为常用方式,简化常用的链式调用
  • 对于非默认值的请求可以自定义进行设置
  • 方便添加自定义行为,利于扩展

1.0 类OC中的AFN封装

  • 利于OC转swift的同学学习
  • 其中对返回值做了JSON和String两种解析,String是为了方便实用HandyJSON,不使用HandyJSON可以自行删除部分代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,609评论 4 59
  • 我从不认为世界上有什么状态算是一直失败,又有什么状态叫做一直成功。甚至说,我对成功和失败这件事,此前根本没有什么特...
    气势如弘阅读 330评论 3 0
  • 各自荒唐 每次天黑有会迎来光亮 留恋什么过往 我便是自己的方向
    有用是无用的阅读 135评论 0 0
  • 你有认识了好久,而且现在还像以前一样亲密无间,无话不谈的好朋友吗? 我觉得有相当一部分会肯定的说,有啊。 那么,你...
    薛定谔的喵i阅读 437评论 0 3