Swift下将网络返回json数据转换成struct
假如网络请求返回的数据结构是一个深层嵌套的Json
首先要通过key-value取出这个json中的数据源
// 将返回的json字符串转Dictory
let json = """
{
"name": "jack",
"age": 20,
"description": "A student."
}
""".data(using: .utf8)!
if let jsonData = jsonString.data(using: .utf8) {
do {
let json = try JSONSerialization.jsonObject(with: jsonData, options: [])
if let dictionary = json as? [String: Any],
let key2 = dictionary["key2"] as? [String: Any],
let innerKey2 = key2["key2"] as? [String: Any],
let value = innerKey2["key1"] as? String {
print(value) // 输出"value3"
}
} catch {
print("解析JSON数据失败:(error)")
}
}
数模转换
// 定义数据类型,遵守Codable协议
// 注意定义的类型与接口返回对应,否则JSONSerialization时崩溃
// Struct模型可以根据json中的数据关系对应嵌套
struct ContactSimpleModel: Codable {
var relation: String
var name: String struct ContactSimpleModel1: Codable {
var relation: String
var name: String struct ContactSimpleModel2: Codable {
var relation: String
var name: String
} }
}

字典与struct互相转换

将字典转换成struct模型
根据网络返回的Dictory,从里面取出数组widgets: Array<[String: Any]>
1.map遍历数组,拿到每一个数组元素字典
2.处理每个元素,先使用JSONSerialization.data(withJSONObject:将字典转成data,
3.再使用JSONDecoder().decode(ContactSimpleModel.self, from: data)将data转成struct结构体。
4.使用struct模型
let decoder = JSONDecoder()
let resList = try widgets.map { (item) -> AdJsonModel in
let data = try JSONSerialization.data(withJSONObject: item, options: [])
let res = try decoder.decode(AdJsonModel.self, from: data)
return res
}
return resList
struct模型转字典
也可以通过给Encodable协议加默认实现,提供便捷Struct转字典方法
// 扩展 Encodable 协议
extension Encodable {
var dictionary: [String: Any]? {
if let data = try? JSONEncoder().encode(self) {
if let dict = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
return dict
}
return nil
}
return nil
} }
 
Struct本地缓存
假如没有使用数据库,通过UserDefaults或者Plist文件保存。
使用data进行保存到UserDefaults
struct Person: Codable {
var name: String
var age: Int
} var people = [Person(name: "John", age: 30), Person(name: "Mary", age: 25)]
//转成data保存
let data = try! JSONEncoder().encode(people)
UserDefaults.standard.set(data, forKey: "peopleData")
//取
if let data = UserDefaults.standard.data(forKey: "peopleData") {
let people = try! JSONDecoder().decode([Person].self, from: data)
}
使用Dictionary保存到Plist文件
本地文件处理
路径判断,创建目录用Url.path
创建目录案例
    lazy var adListDirPath: String? = {
let documentDic = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let adUrl = documentDic?.appendingPathComponent(":ad")
if let adUrlSub = adUrl {
var isDic: ObjCBool = ObjCBool(false)
// 判断adUrlSub.path路径是否存在,如果是文件路径则isDic=false, 如果是目录路径isDic=true
if FileManager.default.fileExists(atPath: adUrlSub.path, isDirectory: &isDic) && isDic.boolValue {
return adUrlSub.absoluteString
} do {
// 如果路径不存在,则创建本地路径,withIntermediateDirectories: true表示如果路径中间有未创建的,则把中间的目录也创建
try FileManager.default.createDirectory(at: adUrlSub, withIntermediateDirectories: true, attributes: nil)
return adUrlSub.absoluteString
} catch {
Logger.error(":adDataManager", content: error.localizedDescription)
return nil
}
}
return nil
}()
写文件要用Url.absoluteString
swift中保存plist文件,使用NSDictionary进行保存

1.先删除历史文件
do {
try FileManager.default.removeItem(at: filePathUrl)
return true
} catch {
Logger.error(":adDataManager", content: error.localizedDescription)
return false
}
2.保存新文件
NSDictionary(object: adList, forKey: adListRootKey).write(to: filePathUrl, atomically: true)
3.读取本地文件
let dict = try NSDictionary(contentsOf: filePathUrl, error: ())
zip文件解压
  func unzipFile() {
let zipPath = "/path/to/zip/file"
let destinationPath = "/path/to/destination/folder"
do {
try ZipArchive.unzipFile(atPath: zipPath, toDestination: destinationPath)
} catch {
print("Error unzipping file: (error.localizedDescription)")
}
}
先缓存后使用,提高用户体验
SDWebImage的先预下载图片,等启动时直接使用缓存的方法
//0.自定义设置缓存大小
URLCache.shared = URLCache(memoryCapacity: 10 * 1024 * 1024, diskCapacity: 50 * 1024 * 1024, diskPath: nil)
//1.缓存
SDWebImage批量下载图片
SDWebImagePrefetcher.shared().prefetchURLs方法下载的图片本地路径默认是Library/Caches/com.hackemist.SDWebImageCache.default目录下的缓存文件。
可以通过SDWebImageManager.shared().imageCache.diskCachePath方法获取具体路径。
//2.使用
在UIImageView加载图片时,使用AAImageView.sd_setImage(with: url, placeholderImage: nil)进行价值
注意:
对于可选类型的数组,如果没有拆包就map, 那么闭包的入参是拆包的数组
let list = dict[adListRootKey] as? Array<[String: Any]>
if let listSub = list {
let decoder = JSONDecoder()
let resList = listSub.map { (item) -> AdJsonModel? in

Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用的更多相关文章

  1. CentOS下搭建wordpress全流程

    突然,想搭建一个个人博客,所以就在网上搜了搜相关内容,好多人推荐wordpress,那么就打算光荣地采用wordpress了.以下是安装过程中遇到的所有的坑,现在总结如下,希望给安装wordpress ...

  2. 简述前后端分离的情况下,Vue实现点击图片下载到本地(并实现IE11浏览器的兼容)

    1.简述 在前后端分离的项目中涉及跨域问题,通常都会使用token进行验证.最近在前后端分离的项目中在一个问题上搞了很久,就是以前下载附件或者导出数据为文件的时候,在以前的那些项目前端可以直接用 wi ...

  3. 探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存的实现

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过前面的文章,我们一起剖析了Guav ...

  4. iOS网络加载图片缓存与SDWebImage

    加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异 ...

  5. python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件)

    python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件) requests是一个Python第三方库,用于向URL地址发起请求 bs4 全名 BeautifulSoup4, ...

  6. canvas 制作flappy bird(像素小鸟)全流程

    flappy bird制作全流程: 一.前言 像素小鸟这个简单的游戏于2014年在网络上爆红,游戏上线一段时间内appleStore上的下载量一度达到5000万次,风靡一时, 近年来移动web的普及为 ...

  7. 【CKB.DEV 茶话会】第二期:聊聊 CKB 钱包和 Nervos DAO 全流程

    CKB.DEV 茶话会第二期:聊聊 CKB 钱包和 Nervos DAO 全流程 为了鼓励更多优秀的开发者和研究人员参与到 CKB 的开发和生态建设中去,我们希望组织一系列 CKB Developer ...

  8. Kafka处理请求的全流程分析

    大家好,我是 yes. 这是我的第三篇Kafka源码分析文章,前两篇讲了日志段的读写和二分算法在kafka索引上的应用 今天来讲讲 Kafka Broker端处理请求的全流程,剖析下底层的网络通信是如 ...

  9. Jenkins+GitLab+SonnarQube搭建CI/CD全流程

    1. CI/CD 1.1 CI - 持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的就是让产品可以快速迭 ...

  10. HMS Core电商与游戏行业解决方案,全流程赋能开发者创新

    2021年12月29日,"华为云&华为终端云服务创新峰会2022"在北京柏悦酒店成功举办.华为HMS Core电商与游戏行业解决方案亮相本次峰会的线下展区,为行业开发者们解 ...

随机推荐

  1. iframe页面加载完成为什么还是获取不到里面的dom

    iframe页面加载完成为什么还是获取不到里面的dom? 因为Iframe是跨域,跨域的情况下是无法获取到iframe里面的DOM的,即使iframe加载完成,也无法获取到里面的DOM. 有什么方法获 ...

  2. [.Net]Framwork WebAPI添加接口请求监控

    思路: 通过重写 ActionFilterAttribute 拦截Action的请求及返回信息,实现对接口请求的监听. 最终效果如下: 全局启用需配置如下: 局部启用需配置如下: 源码如下: 1 // ...

  3. NX二次开发VS环境搭建

    1.安装VS2019(直接安装高版本:与NX匹配时向下兼容,不需要纠结) 2.安装习惯使用的NX(建议直接上NX1980,新版不管是功能还是界面都比低版好用得多.很多人说新版不好用,这只是个人习惯和接 ...

  4. lnmp重新安装mysql

    安装mysql好长时间,一直没去管,后来一直频繁重启,各种网上找方案去解决,最后问题太异常,一顿操作猛如虎之后把mysql彻底搞垮,无奈只能进行重装. whereis mysql mysql: /us ...

  5. [RoarCTF 2019]Easy Calc 1

    进入主页面是一个计算器,可以计算 右键源代码发现提示信息,javascript脚本,其中还有calc.php文件 注释说明了这里引入了waf 尝试访问calc.php 是一道命令执行,尝试输入phpi ...

  6. 基于深度学习的智能PCB板缺陷检测系统(Python+清新界面+数据集)

    摘要:智能PCB板缺陷检测系统用于智能检测工业印刷电路板(PCB)常见缺陷,自动化标注.记录和保存缺陷位置和类型,以辅助电路板的质检.本文详细介绍智能PCB板缺陷检测系统,在介绍算法原理的同时,给出P ...

  7. 详解DDD:如何避免写流水账代码?

    在日常工作中我观察到,面对老系统重构和迁移场景,有大量代码属于流水账代码,通常能看到开发在对外的API接口里直接写业务逻辑代码,或者在一个服务里大量的堆接口,导致业务逻辑实际无法收敛,接口复用性比较差 ...

  8. HTTP TCP UDP WEBSOCKET

    概念: TCP和UDP:传输层协议:(卡车) HTTP:应用层协议:(货物).HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发 ...

  9. TS 基础及在 Vue 中的实践:TypeScript 都发布 5.0 版本啦,现在不学更待何时!

    大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 微软于3月16日发布了 TypeScript 5.0 版本 ...

  10. 全网最详细中英文ChatGPT-GPT-4示例文档-快速创意生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...