FileManager/本地文件增删改查, Cache/图像缓存处理 的操作

news2024/11/15 22:50:00

1. FileManager 本地文件管理器,增删改查文件

  1.1 实现

// 本地文件管理器
class LocalFileManager{
    // 单例模式
    static let instance = LocalFileManager()
    let folderName = "MyApp_Images"
    
    init() {
        createFolderIfNeeded()
    }
    
    // 创建特定应用的文件夹
    func createFolderIfNeeded(){
        // 创建文件夹路径
        guard let path = FileManager
            .default
            .urls(for: .cachesDirectory, in: .userDomainMask)
            .first?
            .appendingPathComponent(folderName)
            .path else {
            return
        }
        
        // 判断文件夹是否存在,不存在,则创建文件夹路径
        if !FileManager.default.fileExists(atPath: path){
            do {
                try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true)
                print("Success create folder.")
            } catch let error {
                print("Error creating folder. \(error)")
            }
        }
    }
    
    // 删除特定应用的文件夹
    func deleteFolder(){
        // 创建文件夹路径
        guard let path = FileManager
            .default
            .urls(for: .cachesDirectory, in: .userDomainMask)
            .first?
            .appendingPathComponent(folderName)
            .path else {
            return
        }
        
        do {
            try FileManager.default.removeItem(atPath: path)
            print("Success deleting filder.")
        } catch let error {
            print("Error deleting folder. \(error)")
        }
    }
    
    // 保存图片
    func saveImage(image: UIImage, name: String) -> String{
        // 压缩图片质量
        //image.jpegData(compressionQuality: 1.0)
        // 获取数据和文件路径
        guard
            let data =  image.pngData(),
            let path = getPathForImage(name: name)
        else{
            return "Error getting data."
        }
        
        do{
            // 文件写入数据
            try data.write(to: path)
            return "Success saving."
        }catch let error{
            return "Error saving: \(error.localizedDescription)"
        }
    }
    
    // 获取图片
    func getImage(name: String) -> UIImage?{
        // 获取文件路径 absoluteString,并检查文件是否存在
        guard let path = getPathForImage(name: name)?.path,
              FileManager.default.fileExists(atPath: path) else{
            print("Error getting path.")
            return nil
        }
        return UIImage(contentsOfFile: path)
    }
    
    // 删除图片
    func deleteImage(name: String) -> String{
        // 获取文件路径,并检查文件是否存在
        guard let path = getPathForImage(name: name)?.path,
              FileManager.default.fileExists(atPath: path) else{
            return "Error getting path."
        }
        do {
            // 删除文件
            try FileManager.default.removeItem(atPath: path)
            return "Successfully deleted."
        } catch let error {
            return "Error deleting image: \(error)"
        }
    }
    
    // 获取文件路径
    func getPathForImage(name: String) -> URL?{
        // 文档目录
        //let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        // 缓存目录
        //let directory2 = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first
        // 临时目录
        //let directory3 = FileManager.default.temporaryDirectory
        // 拼接路径
        //let path = directory2?.appendingPathComponent("\(name).png")
        guard
            let path = FileManager
                .default
                .urls(for: .cachesDirectory, in: .userDomainMask)
                .first?
                .appendingPathComponent(folderName)
                .appendingPathComponent("\(name).png") else {
            print("Error getting data.")
            return nil
            
        }
        print(path)
        return path
    }
}

class FileManagerViewModel: ObservableObject{
    @Published var image: UIImage? = nil
    let imageName: String = "steve-jobs"
    let localManager  = LocalFileManager.instance
    @Published var infoMessage: String  = ""
    
    init() {
        getImageFromAssetsFoler()
        //getImageFromFileManager()
    }
    // 获取图片,在资源目录
    func getImageFromAssetsFoler(){
        image = UIImage(named: imageName)
    }
    // 获取图像,文件管理器
    func getImageFromFileManager(){
        image = localManager.getImage(name: imageName)
    }
    // 保存图像
    func saveImage(){
        guard let image = image else { return }
        infoMessage = localManager.saveImage(image: image, name: imageName)
    }
    // 删除图像
    func deleteImage(){
        infoMessage = localManager.deleteImage(name: imageName)
        localManager.deleteFolder()
    }
}

/// 文件管理器
struct FileManagerBootcamp: View {
    @StateObject var viewModel = FileManagerViewModel()
    
    var body: some View {
        NavigationView {
            VStack {
                if let image = viewModel.image {
                    Image(uiImage: image)
                        .resizable()
                        .scaledToFill()
                        .frame(width: 200, height: 200)
                        .clipped()
                        .cornerRadius(10)
                }
                
                HStack {
                    Button {
                        viewModel.saveImage()
                    } label: {
                        Text("Save to Fm")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding()
                            .padding(.horizontal)
                            .background(Color.accentColor)
                            .cornerRadius(10)
                    }
                    
                    Button {
                        viewModel.deleteImage()
                    } label: {
                        Text("Delete from Fm")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding()
                            .padding(.horizontal)
                            .background(Color.red)
                            .cornerRadius(10)
                    }
                }
                
                Text(viewModel.infoMessage)
                    .font(.largeTitle)
                    .fontWeight(.semibold)
                    .foregroundColor(.purple)
                //.padding(.top, 20)
    
                Spacer()
            }
            .navigationTitle("File Manager")
        }
    }
}

  1.2 效果图

2. Cache 图像缓存处理操作

  2.1 实现

// 缓存管理器
class CacheManager {
    // 单例模式
    static let instance = CacheManager()
    
    private init() {}
    
    // 计算型属性 图像缓存
    var imageCache: NSCache<NSString, UIImage> = {
        let cache = NSCache<NSString, UIImage>()
        // 容纳最大对象的数量
        cache.countLimit = 100
        // 容纳最大值
        cache.totalCostLimit = 1024 * 1024 * 100 // 100mb
        return cache
    }()
    
    // 添加图像
    func add(image: UIImage, name: String) -> String{
        imageCache.setObject(image, forKey: name as NSString)
        return "Added to cache!"
    }
    
    // 移除图像
    func remove(name: String) -> String{
        imageCache.removeObject(forKey: name as NSString)
        return "Removed from cache"
    }
    
    // 获取图像
    func get(name: String) -> UIImage?{
        return imageCache.object(forKey: name as NSString)
    }
}

// 缓存 ViewModel
class CacheViewModel: ObservableObject{
    @Published var startingImage: UIImage? = nil
    @Published var cachedImage: UIImage? = nil
    @Published var infoMessage: String = ""
    
    let imageName = "steve-jobs"
    let manager = CacheManager.instance
    
    init() {
        getImageFromAssetsFolder()
    }
    
    // 获取资源文件中图像
    func getImageFromAssetsFolder(){
        startingImage = UIImage(named: imageName)
    }
    
    // 保存图像
    func saveToCache(){
        guard let image = startingImage else { return }
        infoMessage = manager.add(image: image, name: imageName)
    }
    
    // 移除图像
    func removeFromCache(){
        infoMessage = manager.remove(name: imageName)
    }
    
    // 获取缓存图像
    func getFromCache(){
        if let returnedImage = manager.get(name: imageName){
            cachedImage = returnedImage
            infoMessage = "Got image from cache"
        }else{
            cachedImage = nil
            infoMessage = "Image not found in cache"
        }
    }
}

// 缓存管理
struct CacheBootcamp: View {
    @StateObject var viewModel = CacheViewModel()
    
    var body: some View {
        NavigationView {
            VStack {
                if let image = viewModel.startingImage{
                    Image(uiImage: image)
                        .resizable()
                        .scaledToFill()
                        .frame(width: 200, height: 200)
                        .clipped()
                        .cornerRadius(10)
                }
                
                Text(viewModel.infoMessage)
                    .font(.largeTitle)
                    .fontWeight(.semibold)
                    .foregroundColor(Color.purple)
                
                HStack {
                    Button {
                        viewModel.saveToCache()
                    } label: {
                        Text("Save to Cache")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding()
                            .background(Color.accentColor)
                            .cornerRadius(10)
                    }
                    
                    Button {
                        viewModel.removeFromCache()
                    } label: {
                        Text("Delete from Cache")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding()
                            .background(Color.red)
                            .cornerRadius(10)
                    }
                }
                
                Button {
                    viewModel.getFromCache()
                } label: {
                    Text("Get from Cache")
                        .font(.headline)
                        .foregroundColor(.white)
                        .padding()
                        .background(Color.green)
                        .cornerRadius(10)
                }
                
                if let image = viewModel.cachedImage{
                    Image(uiImage: image)
                        .resizable()
                        .scaledToFill()
                        .frame(width: 200, height: 200)
                        .clipped()
                        .cornerRadius(10)
                }
                
                Spacer()
            }
            .navigationTitle("Cache Bootcamp")
        }
    }
}

  2.2 效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在英文电脑系统中,中文显示??????

如果操作系统是英文的&#xff0c;那么无论是在cmd界面&#xff0c;还是在Visual Studio的调试界面&#xff0c;中文显示都是一串问号??????? 这是因为在英文系统中&#xff0c;Console 的默认代码页是 437(OEM -United States)&#xff0c;不支持中文输入输出&#xff…

照片后期处理软件DxO FilmPack 6 mac中文说明

DxO FilmPack 6 for Mac是一款照片后期处理软件。它可以模拟超过60种著名胶片品牌和类型的色彩和颗粒感&#xff0c;使照片具有复古、艺术和时尚风格。 ​DxO FilmPack 6 mac支持RAW和JPG格式的照片&#xff0c;并提供丰富的调整选项&#xff0c;如亮度、对比度、曝光、阴影和高…

十六.镜头知识之工业镜头的质量判断因素

十六.镜头知识之工业镜头的质量判断因素 文章目录 十六.镜头知识之工业镜头的质量判断因素1.分辨率(Resolution)2.明锐度(Acutance)3.景深(DOF)&#xff1a;4. 最大相对孔径与光圈系数5.工业镜头各参数间的相互影响关系5.1.焦距大小的影响情况5.2.光圈大小的影响情况5.3.像场中…

【Java 进阶篇】深入理解SQL查询语言(DQL)

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的强大编程语言。它提供了各种命令和语句&#xff0c;用于执行各种操作&#xff0c;包括数据查询、插入、更新和删除。本文将深入探讨SQL查询语言&#xff08;DQL&#xff09;&#xff0c;它是…

Bootstrap的弹性盒子布局学习笔记

Bootstrap的弹性盒子布局学习笔记 目录 01-综述02-利用类d-flex与类d-inline-flex将容器定义为弹性盒子03-对弹性容器的的元素在水平方向上进行排列顺序设置03-对弹性容器的的元素在垂直方向上进行排列顺序设置04-弹性盒子内所有元素在主轴方向上的对齐方式05-1-弹性盒子内各行…

myArm 全新七轴桌面型机械臂

引言 在不断演进的科技世界中&#xff0c;我们始终追求创新和卓越&#xff0c;以满足客户的需求并超越他们的期望。今天&#xff0c;我们很高兴地宣布我们的最新产品——myArm 300 Pi&#xff0c;一款七轴的桌面型机械臂。这款产品的独特之处在于其灵活性和可编程性&#xff0c…

16. Seata 分布式事务

Spring Cloud 微服务系列文章&#xff0c;点击上方合集↑ 1. 简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。 事务是保障一系列操作要么都成功&#xff0c;要么都失败。就比如转账&#xff1a;A转账100元给B&#xff0…

sentinel-dashboard-1.8.0.jar开机自启动脚本

启动阿里巴巴的流控组件控制面板需要运行一个jar包&#xff0c;通常需要运行如下命令&#xff1a; java -server -Xms4G -Xmx4G -Dserver.port8080 -Dcsp.sentinel.dashboard.server127.0.0.1:8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.0.jar &…

如何评估测试用例的优先级?

评估测试用例的优先级&#xff0c;有助于我们及早发现和解决可能对系统稳定性和功能完整性产生重大影响的问题&#xff0c;助于提高测试质量&#xff0c;提高用户满意度。 如果没有做好测试用例的优先级评估&#xff0c;往往容易造成对系统关键功能和高风险场景测试的忽略&…

STM32定时器

目录 基本定时器结构框图 通用定时器结构框图 高级定时器结构框图 ​编辑TIMx时基单元 定时工作原理 影子寄存器 ​编辑 定时器中断基本结构 定时器计时中断 定时器外部中断 输出比较 OC 输出比较模式 PWM基本结构 输出比较常用函数 使用PWM来驱动舵机 输入捕…

NAS文件的名称或路径过长导致文件同步被挂起

将文件复制到群晖设备时遇到文件名长度限制问题&#xff0c;NTFS文件系统&#xff08;通过Samba等方式在群晖上使用&#xff09;: 在Windows系统上广泛使用的NTFS文件系统也支持较长的文件名&#xff0c;最大长度为255个字符。然而&#xff0c;要注意的是&#xff0c;使用Samba…

如何找回回收站删除的文件?文件恢复,3个方法!

“求助求助&#xff01;回收站里面删除的文件还能恢复吗&#xff1f;在清理电脑内存的时候一不小心把回收站清空了&#xff0c;现在不知道如何是好&#xff0c;请大家帮帮我&#xff01;” 电脑回收站里的文件清空了就是被永久删除了吗&#xff1f;如果误删了回收站里的文件还有…

成都优优聚是做美团餐饮代运营的吗?

成都优优聚公司是一家专注于美团代运营的企业&#xff0c;致力于为餐饮业主提供全方位的服务和解决方案。在如今的互联网时代&#xff0c;美团已经成为了许多餐饮业主不可或缺的平台之一&#xff0c;但是对于一些传统的餐饮业主来说&#xff0c;运营美团平台可能并不容易&#…

直播软件开发趋势揭秘:抓住行业热点实现爆发增长

直播软件开发者们正迎来一个前所未有的繁荣时期。随着社交媒体的普及和5G网络的迅猛发展&#xff0c;直播行业吸引了越来越多的用户&#xff0c;创造了巨大的商机。本文将揭示最新的直播软件开发趋势&#xff0c;帮助你抓住这个行业的热点&#xff0c;实现爆发性的增长。 关键…

【广州华锐互动】屠宰场生猪检疫VR模拟演练系统

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在各个领域的应用越来越广泛。在教育领域&#xff0c;VR技术也为学生提供了更加真实和沉浸式的学习体验。屠宰场生猪检疫VR模拟演练系统由VR公司广州华锐互动所开发&#xff0c;作为一种新型的教学方式&a…

黑马VUE3视频笔记

目录 一、使用create-vue创建项目 二、setup选项 三、reactive和ref函数 1.reactive() 2.ref() 三、computed 四、watch ​五、生命周期函数 六、父传子、子传父 父传子defineProps 子传父defineEmits 七、模板引用 ref defineExpose 八、跨层传递普通数据 prov…

正交对角化,奇异值分解

与普通矩阵对角化不同的是&#xff0c;正交对角化是使用正交矩阵对角化&#xff0c;正交矩阵是每列向量都是单位向量&#xff0c;正交矩阵*它的转置就是单位矩阵 与普通矩阵对角化一样&#xff0c;正交对角化的结果也是由特征值组成的对角矩阵 本质还是特征向量对原矩阵的拉伸…

Go 里的超时控制

前言 日常开发中我们大概率会遇到超时控制的场景&#xff0c;比如一个批量耗时任务、网络请求等&#xff1b;一个良好的超时控制可以有效的避免一些问题&#xff08;比如 goroutine 泄露、资源不释放等&#xff09;。 Timer 在 go 中实现超时控制的方法非常简单&#xff0c;…

【3】贪心算法-最优装载问题-加勒比海盗

算法背景 在北美洲东南部&#xff0c;有一片神秘的海域&#xff0c;那里碧海蓝天、阳光 明媚&#xff0c;这正是传说中海盗最活跃的加勒比海&#xff08;Caribbean Sea&#xff09;。 有一天&#xff0c;海盗们截获了一艘装满各种各样古董的货船&#xff0c;每一 件古董都价值连…

python time和datetime的常用转换处理

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 一、time 1、…