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

news/2024/7/20 21:12:36 标签: iOS, Swift, UI

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

  1.1 实现

Swift">// 本地文件管理器
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 实现

Swift">// 缓存管理器
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.niftyadmin.cn/n/5057011.html

相关文章

深入理解 JVM 之——垃圾回收与内存分配策略

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 垃圾回收策略 说起垃圾收集&#xff08;Garbage Collection&#xff0c;下文简称GC&#xff09;&#xff0c;有不少人把这项技术当作Java语言的伴生产物。事实上&#xff0c;垃圾收集的历史远远比Java久远&…

python 使用 scapy 扫描内网IP或端口

地址信息在IP层, 可以利用 ICMP 或 ARP 协议数据包探测IP信息. ICMP协议可以利用ping工具发送数据包, 但是防火墙有可能禁止ICMP, 无法有效探测, 可以考虑使用ARP探测. 利用ICMP协议探测内网IP def ping_ip(ip_fex):# 扫描范围: 128~254for i in range(128, 255):ip f{ip_fe…

安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识

安卓机型app的编译与反编译 apk文件的简单说明与解析 -安卓修改apk apk的组成和编译 一 电脑端几种反编译apk工具操作步骤解析 前面几个博文有说明关于反编译apk和apk架构等有些常识.今天对以上做个补充。初学者记住一点。对于一个apk文件使用压缩软件7zip打开可以查看到文件…

使用screw自动生成数据库文档

screw是一款简洁好用的数据库表结构文档生成器 下面展示如何运行代码自动生成数据库表结构文档 1.引入依赖 <!-- screw核心 --> <dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>…

vuex实现简易购物车加购效果

目录 一、加购效果动图二、前提条件三、开始操作四、解决vuex刷新数据丢失问题五、最终效果 一、加购效果动图 二、前提条件 创建了vue项目&#xff0c;安装了vuex 三、开始操作 目录结构如下&#xff1a; main.js文件中引入store: import Vue from vue import App from ./…

超大表格组件滚动渲染优化

引用自 摸鱼wiki 背景 业务中需要渲染一个最多有100列的表格&#xff0c;由于表格使用原生dom实现&#xff0c;因此会出现同屏有近1000个单元格同时绘制&#xff0c;在快速滑动时页面会产生卡顿&#xff0c;影响用户体验。 方案 如下图所示&#xff0c;由于用户显示屏区域有…

openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划

文章目录 openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划83.1 MOT内存规划83.2 存储IO83.3 容量需求 openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划 本节描述了为满足特定…

自拟实现消息队列(MQ)基于Rabbit MQ(含概念和源码)巨详细!!!!!含思维导图

MQ目录 MQ基本概念什么是MQ&#xff1f;MQ的应用场景 首先先明白需求持久化分析那么MQ如何设计持久化&#xff1f; 可靠性分析高效性分析MQ核心概念&#xff08;装配层&#xff09;实现MQ组件思维导图创建项目导入数据库下载SqLite。 创建组件实体类创建交换机&#xff08;要加…