1. FileManager 本地文件管理器,增刪改查文件
? 1.1 實(shí)現(xiàn)
// 本地文件管理器
class LocalFileManager{// 單例模式static let instance = LocalFileManager()let folderName = "MyApp_Images"init() {createFolderIfNeeded()}// 創(chuàng)建特定應(yīng)用的文件夾func createFolderIfNeeded(){// 創(chuàng)建文件夾路徑guard let path = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first?.appendingPathComponent(folderName).path else {return}// 判斷文件夾是否存在,不存在,則創(chuàng)建文件夾路徑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)")}}}// 刪除特定應(yīng)用的文件夾func deleteFolder(){// 創(chuàng)建文件夾路徑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{// 壓縮圖片質(zhì)量//image.jpegData(compressionQuality: 1.0)// 獲取數(shù)據(jù)和文件路徑guardlet data = image.pngData(),let path = getPathForImage(name: name)else{return "Error getting data."}do{// 文件寫入數(shù)據(jù)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// 臨時(shí)目錄//let directory3 = FileManager.default.temporaryDirectory// 拼接路徑//let path = directory2?.appendingPathComponent("\(name).png")guardlet 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? = nillet 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 實(shí)現(xiàn)
// 緩存管理器
class CacheManager {// 單例模式static let instance = CacheManager()private init() {}// 計(jì)算型屬性 圖像緩存var imageCache: NSCache<NSString, UIImage> = {let cache = NSCache<NSString, UIImage>()// 容納最大對(duì)象的數(shù)量cache.countLimit = 100// 容納最大值cache.totalCostLimit = 1024 * 1024 * 100 // 100mbreturn 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.instanceinit() {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 = returnedImageinfoMessage = "Got image from cache"}else{cachedImage = nilinfoMessage = "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 效果圖
