首页 > 其他分享 >Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用

Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用

时间:2023-05-04 21:23:37浏览次数:38  
标签:return String Swift data try let var 数模转换 Data

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

 

 

 

 

 

标签:return,String,Swift,data,try,let,var,数模转换,Data
From: https://www.cnblogs.com/zhou--fei/p/17372535.html

相关文章

  • Databend 开源周报第 91 期
    Databend是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn。What'sOnInDatabend探索Databend本周新进展,遇到更贴近你心意的Databend。新数据类型:BITMAPDatabend新增对BITMAP数据类型的支......
  • datax_v202303 编译和使用
    下载源码gitclonehttps://github.com/alibaba/DataX.git#查看taggittaggitcheckoutdatax_v202303安装无法下载的jar到本地仓库下载地址pentaho-aggdesigner-algorithm-5.1.5-jhyde.jarhttps://github.com/xiaohaibaba/share_jar/raw/main/pentaho-aggdesigner-algor......
  • 使用Kepserver 自带 DataLogger 功能 实现工控数据转储关系型数据库
    本文以Mysql数据库为例,介绍使用kepserver的datalogger功能转储数据到mysql第一步:下载安装MysqlODBC数据库驱动前往官网下载ODBC驱动https://downloads.MySQL.com/archives/c-ODBC/建议下载msi格式的安装文件  下载完成后,直接安装。如果安装过程报这个错,那就下载......
  • Nacos修改权重报错caused: errCode: 500, errMsg: do metadata operation failed ;caus
    今天修改Nacos权重时报错如下:caused:errCode:500, caused:errCode:500,errMsg:dometadataoperationfailed;caused:com.alibaba.nacos.con。解决方案:停掉nacos服务将nacos文件夹下data中的protocol文件夹删除重启nacos服务即可 ......
  • Avalonia使用d:DataContext实现设计时预览
    ​ 在我们使用MVVM开发项目时,免不了要用到绑定,但是数据通过绑定获取的时候,就不能再预览器里看到效果了,只能调试起来才能看到,这样就很麻烦。​ 我们可以通过d.DataContext来解决,这个属性仅在设计时应用DataContext。官网建议将此属性与{x:Static}指令结合使用,下面我们新建个......
  • java.Tang.CassNotFoundException javax.xmL.bind.DatatypeConverter
    报错如下图所示:故障原因:JAXBAPI是javaEE的API,因此在javaSE9.0中不再包含这个Jar包。java9中引入了模块的概念,默认情况下,JavaSE中将不再包含javaEE的Jar包而在java6/7/8时关于这个API都是捆绑在一起的解决方案:降低JDK版本到JDK8手动加入这些依赖......
  • mybatis中<![CDATA[]]>的作用
    <=小于等于:<![CDATA[<=]]>>=大于等于:<![CDATA[>=]]>一些特殊字符也可用下面的替代符号所代替。特殊字符替代符号&&amp;<<>>""'&apos;......
  • Android JetPack~LiveData(二) 数据倒灌问题
    Android数据绑定技术一,企业级开发Android数据绑定技术二,企业级开发Android JetPack~DataBinding(数据绑定)(一)  集成与使用Android JetPack~LiveData(一) 介绍与使用AndroidJetPack~LiveData(二)数据倒灌问题Android JetPack~ViewModel(一) 介绍与......
  • DataWindowHTTP(三)服务器安装-WEBSERVER
    本组件需要的一个webserver+PHP环境,版本要求为apache2.4+PHP8.0。可以通过两种方式安装:自动安装包(一键安装包)一键安装包有:XAMPP,PhpStudy,Appserv,wampserver,wnmp,DedeAMPZ,LNMP(linux)。到目前较多为apache2.4+php7.x,很快应该会支持到最新的php8.x。二.手工安装配置手工配置,不依赖其他工......
  • Datawindow如何降低版本
    datawindow有时需要从高版本导入到低版本去。因为兼容性的问题,高版本添加了一些新属性,但是保留了低版本的大部分特性。所以我们只要安装pb提示删除新的属性就能导入到低版本中。如图操作1.低版本中随便新建一个dw,然后命名与高版本中这个dw相同2.右键,editsource,复制粘贴高版本的dw源......