Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用
// 将返回的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互相转换
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
// 扩展 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 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)
}
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
}()
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: ())
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)")
}
}
//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)进行价值
let list = dict[adListRootKey] as? Array<[String: Any]>
if let listSub = list {
let decoder = JSONDecoder()
let resList = listSub.map { (item) -> AdJsonModel? in
Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用的更多相关文章
- CentOS下搭建wordpress全流程
突然,想搭建一个个人博客,所以就在网上搜了搜相关内容,好多人推荐wordpress,那么就打算光荣地采用wordpress了.以下是安装过程中遇到的所有的坑,现在总结如下,希望给安装wordpress ...
- 简述前后端分离的情况下,Vue实现点击图片下载到本地(并实现IE11浏览器的兼容)
1.简述 在前后端分离的项目中涉及跨域问题,通常都会使用token进行验证.最近在前后端分离的项目中在一个问题上搞了很久,就是以前下载附件或者导出数据为文件的时候,在以前的那些项目前端可以直接用 wi ...
- 探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存的实现
大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过前面的文章,我们一起剖析了Guav ...
- iOS网络加载图片缓存与SDWebImage
加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异 ...
- python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件)
python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件) requests是一个Python第三方库,用于向URL地址发起请求 bs4 全名 BeautifulSoup4, ...
- canvas 制作flappy bird(像素小鸟)全流程
flappy bird制作全流程: 一.前言 像素小鸟这个简单的游戏于2014年在网络上爆红,游戏上线一段时间内appleStore上的下载量一度达到5000万次,风靡一时, 近年来移动web的普及为 ...
- 【CKB.DEV 茶话会】第二期:聊聊 CKB 钱包和 Nervos DAO 全流程
CKB.DEV 茶话会第二期:聊聊 CKB 钱包和 Nervos DAO 全流程 为了鼓励更多优秀的开发者和研究人员参与到 CKB 的开发和生态建设中去,我们希望组织一系列 CKB Developer ...
- Kafka处理请求的全流程分析
大家好,我是 yes. 这是我的第三篇Kafka源码分析文章,前两篇讲了日志段的读写和二分算法在kafka索引上的应用 今天来讲讲 Kafka Broker端处理请求的全流程,剖析下底层的网络通信是如 ...
- Jenkins+GitLab+SonnarQube搭建CI/CD全流程
1. CI/CD 1.1 CI - 持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的就是让产品可以快速迭 ...
- HMS Core电商与游戏行业解决方案,全流程赋能开发者创新
2021年12月29日,"华为云&华为终端云服务创新峰会2022"在北京柏悦酒店成功举办.华为HMS Core电商与游戏行业解决方案亮相本次峰会的线下展区,为行业开发者们解 ...
随机推荐
- defer语句
1.defer语句 延时机制,在函数中,经常需要创建资源(比如:数据库连接.文件句柄.锁等),为了在函数执行完毕后,及时释放资源,使用defer a. 当执行defer时,暂时不执行,会将defer后 ...
- ubuntu下删除U盘文件到回收站无法清空问题的解决
Ubuntu可以自动加载U盘 每当,拷贝新的文件,而空间不足的时候,就会删除原有的文件. 可是,它不是彻底删除,而是放在垃圾箱中(/home/mrc/.local/share/Trash/files) ...
- bug单建单规范
bug提单保证,清晰.简单.明了. 标题: [版本][服务器][模块][必现/偶现]bug标题(最短的话描述bug) 例:[0.9.0][dev][系统][必现]点击商店,跳转到仓库页面 bug模 ...
- fatal: unable to access ' ' OpenSSL SSL_read: Connection was reset, errno 10054
描述: git clone ...时报错 fatal: unable to access 'https://github.com/github-eliviate/papers.git/': OpenS ...
- Spring设计模式——代理模式[手写实现JDK动态代理]
代理模式 代理模式(Proxy Pattern):是指为其他对象提供一种代理,以控制对这个对象的访问. 代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构型设计模式. 使用代理模式主要有两个 ...
- 使用RPA有什么好处
通过本章学习,您将了解到: 什么是RPA RPA能为我们做些什么 使用RPA有什么好处 RPA的体系结构是什么 应用RPA是否需要深入了解这项技术 RPA的未来趋势怎么样 什么是RPA? RPA即Ro ...
- Python学习笔记--循环的知识以及应用
while循环 代码: 结果: 案例:求1-100的和 实现: 案例:while循环猜数字 实现: while循环的嵌套使用 案例:打印九九乘法表 (注意:要是想要输出不换行,代码可以这样写:prin ...
- vue 和 react 的区别有哪些
vue 和 react 有什么区别呢?下面从这 4 个角度来说一说! (1)从编程范式的角度讲 在 vue-loader.vue-template-compiler 的支持下,vue 可以采用 SFC ...
- 基于DPDK抓包的Suricata安装部署
一.背景 Suricata支持网卡在线抓包和离线读取PCAP包两种形式的抓包: 离线抓包天然具有速度慢.非实时的特点 在线捕获数据包又包括常规网卡抓包.PF_RING和DPDK的方式 由于项目分光的流 ...
- 网页静态化技术 Freemarker
网页静态化解决方案在实际运用中比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道.对于电商网站的商品详细页(几百万的商品,同样的页面模板格局)来说,每个商品又有大量的信息,这样的情况同样也适 ...