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


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

      1.1 资源图片: steve-jobs.png

      1.2 实现

    1. // 本地文件管理器
    2. class LocalFileManager{
    3. // 单例模式
    4. static let instance = LocalFileManager()
    5. let folderName = "MyApp_Images"
    6. init() {
    7. createFolderIfNeeded()
    8. }
    9. // 创建特定应用的文件夹
    10. func createFolderIfNeeded(){
    11. // 创建文件夹路径
    12. guard let path = FileManager
    13. .default
    14. .urls(for: .cachesDirectory, in: .userDomainMask)
    15. .first?
    16. .appendingPathComponent(folderName)
    17. .path else {
    18. return
    19. }
    20. // 判断文件夹是否存在,不存在,则创建文件夹路径
    21. if !FileManager.default.fileExists(atPath: path){
    22. do {
    23. try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true)
    24. print("Success create folder.")
    25. } catch let error {
    26. print("Error creating folder. \(error)")
    27. }
    28. }
    29. }
    30. // 删除特定应用的文件夹
    31. func deleteFolder(){
    32. // 创建文件夹路径
    33. guard let path = FileManager
    34. .default
    35. .urls(for: .cachesDirectory, in: .userDomainMask)
    36. .first?
    37. .appendingPathComponent(folderName)
    38. .path else {
    39. return
    40. }
    41. do {
    42. try FileManager.default.removeItem(atPath: path)
    43. print("Success deleting filder.")
    44. } catch let error {
    45. print("Error deleting folder. \(error)")
    46. }
    47. }
    48. // 保存图片
    49. func saveImage(image: UIImage, name: String) -> String{
    50. // 压缩图片质量
    51. //image.jpegData(compressionQuality: 1.0)
    52. // 获取数据和文件路径
    53. guard
    54. let data = image.pngData(),
    55. let path = getPathForImage(name: name)
    56. else{
    57. return "Error getting data."
    58. }
    59. do{
    60. // 文件写入数据
    61. try data.write(to: path)
    62. return "Success saving."
    63. }catch let error{
    64. return "Error saving: \(error.localizedDescription)"
    65. }
    66. }
    67. // 获取图片
    68. func getImage(name: String) -> UIImage?{
    69. // 获取文件路径 absoluteString,并检查文件是否存在
    70. guard let path = getPathForImage(name: name)?.path,
    71. FileManager.default.fileExists(atPath: path) else{
    72. print("Error getting path.")
    73. return nil
    74. }
    75. return UIImage(contentsOfFile: path)
    76. }
    77. // 删除图片
    78. func deleteImage(name: String) -> String{
    79. // 获取文件路径,并检查文件是否存在
    80. guard let path = getPathForImage(name: name)?.path,
    81. FileManager.default.fileExists(atPath: path) else{
    82. return "Error getting path."
    83. }
    84. do {
    85. // 删除文件
    86. try FileManager.default.removeItem(atPath: path)
    87. return "Successfully deleted."
    88. } catch let error {
    89. return "Error deleting image: \(error)"
    90. }
    91. }
    92. // 获取文件路径
    93. func getPathForImage(name: String) -> URL?{
    94. // 文档目录
    95. //let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    96. // 缓存目录
    97. //let directory2 = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first
    98. // 临时目录
    99. //let directory3 = FileManager.default.temporaryDirectory
    100. // 拼接路径
    101. //let path = directory2?.appendingPathComponent("\(name).png")
    102. guard
    103. let path = FileManager
    104. .default
    105. .urls(for: .cachesDirectory, in: .userDomainMask)
    106. .first?
    107. .appendingPathComponent(folderName)
    108. .appendingPathComponent("\(name).png") else {
    109. print("Error getting data.")
    110. return nil
    111. }
    112. print(path)
    113. return path
    114. }
    115. }
    116. class FileManagerViewModel: ObservableObject{
    117. @Published var image: UIImage? = nil
    118. let imageName: String = "steve-jobs"
    119. let localManager = LocalFileManager.instance
    120. @Published var infoMessage: String = ""
    121. init() {
    122. getImageFromAssetsFoler()
    123. //getImageFromFileManager()
    124. }
    125. // 获取图片,在资源目录
    126. func getImageFromAssetsFoler(){
    127. image = UIImage(named: imageName)
    128. }
    129. // 获取图像,文件管理器
    130. func getImageFromFileManager(){
    131. image = localManager.getImage(name: imageName)
    132. }
    133. // 保存图像
    134. func saveImage(){
    135. guard let image = image else { return }
    136. infoMessage = localManager.saveImage(image: image, name: imageName)
    137. }
    138. // 删除图像
    139. func deleteImage(){
    140. infoMessage = localManager.deleteImage(name: imageName)
    141. localManager.deleteFolder()
    142. }
    143. }
    144. /// 文件管理器
    145. struct FileManagerBootcamp: View {
    146. @StateObject var viewModel = FileManagerViewModel()
    147. var body: some View {
    148. NavigationView {
    149. VStack {
    150. if let image = viewModel.image {
    151. Image(uiImage: image)
    152. .resizable()
    153. .scaledToFill()
    154. .frame(width: 200, height: 200)
    155. .clipped()
    156. .cornerRadius(10)
    157. }
    158. HStack {
    159. Button {
    160. viewModel.saveImage()
    161. } label: {
    162. Text("Save to Fm")
    163. .font(.headline)
    164. .foregroundColor(.white)
    165. .padding()
    166. .padding(.horizontal)
    167. .background(Color.accentColor)
    168. .cornerRadius(10)
    169. }
    170. Button {
    171. viewModel.deleteImage()
    172. } label: {
    173. Text("Delete from Fm")
    174. .font(.headline)
    175. .foregroundColor(.white)
    176. .padding()
    177. .padding(.horizontal)
    178. .background(Color.red)
    179. .cornerRadius(10)
    180. }
    181. }
    182. Text(viewModel.infoMessage)
    183. .font(.largeTitle)
    184. .fontWeight(.semibold)
    185. .foregroundColor(.purple)
    186. //.padding(.top, 20)
    187. Spacer()
    188. }
    189. .navigationTitle("File Manager")
    190. }
    191. }
    192. }

      1.3 效果图

    2. Cache 图像缓存处理操作

      2.1 资源图片: steve-jobs.png

      2.2 实现

    1. // 缓存管理器
    2. class CacheManager {
    3. // 单例模式
    4. static let instance = CacheManager()
    5. private init() {}
    6. // 计算型属性 图像缓存
    7. var imageCache: NSCache<NSString, UIImage> = {
    8. let cache = NSCache<NSString, UIImage>()
    9. // 容纳最大对象的数量
    10. cache.countLimit = 100
    11. // 容纳最大值
    12. cache.totalCostLimit = 1024 * 1024 * 100 // 100mb
    13. return cache
    14. }()
    15. // 添加图像
    16. func add(image: UIImage, name: String) -> String{
    17. imageCache.setObject(image, forKey: name as NSString)
    18. return "Added to cache!"
    19. }
    20. // 移除图像
    21. func remove(name: String) -> String{
    22. imageCache.removeObject(forKey: name as NSString)
    23. return "Removed from cache"
    24. }
    25. // 获取图像
    26. func get(name: String) -> UIImage?{
    27. return imageCache.object(forKey: name as NSString)
    28. }
    29. }
    30. // 缓存 ViewModel
    31. class CacheViewModel: ObservableObject{
    32. @Published var startingImage: UIImage? = nil
    33. @Published var cachedImage: UIImage? = nil
    34. @Published var infoMessage: String = ""
    35. let imageName = "steve-jobs"
    36. let manager = CacheManager.instance
    37. init() {
    38. getImageFromAssetsFolder()
    39. }
    40. // 获取资源文件中图像
    41. func getImageFromAssetsFolder(){
    42. startingImage = UIImage(named: imageName)
    43. }
    44. // 保存图像
    45. func saveToCache(){
    46. guard let image = startingImage else { return }
    47. infoMessage = manager.add(image: image, name: imageName)
    48. }
    49. // 移除图像
    50. func removeFromCache(){
    51. infoMessage = manager.remove(name: imageName)
    52. }
    53. // 获取缓存图像
    54. func getFromCache(){
    55. if let returnedImage = manager.get(name: imageName){
    56. cachedImage = returnedImage
    57. infoMessage = "Got image from cache"
    58. }else{
    59. cachedImage = nil
    60. infoMessage = "Image not found in cache"
    61. }
    62. }
    63. }
    64. // 缓存管理
    65. struct CacheBootcamp: View {
    66. @StateObject var viewModel = CacheViewModel()
    67. var body: some View {
    68. NavigationView {
    69. VStack {
    70. if let image = viewModel.startingImage{
    71. Image(uiImage: image)
    72. .resizable()
    73. .scaledToFill()
    74. .frame(width: 200, height: 200)
    75. .clipped()
    76. .cornerRadius(10)
    77. }
    78. Text(viewModel.infoMessage)
    79. .font(.largeTitle)
    80. .fontWeight(.semibold)
    81. .foregroundColor(Color.purple)
    82. HStack {
    83. Button {
    84. viewModel.saveToCache()
    85. } label: {
    86. Text("Save to Cache")
    87. .font(.headline)
    88. .foregroundColor(.white)
    89. .padding()
    90. .background(Color.accentColor)
    91. .cornerRadius(10)
    92. }
    93. Button {
    94. viewModel.removeFromCache()
    95. } label: {
    96. Text("Delete from Cache")
    97. .font(.headline)
    98. .foregroundColor(.white)
    99. .padding()
    100. .background(Color.red)
    101. .cornerRadius(10)
    102. }
    103. }
    104. Button {
    105. viewModel.getFromCache()
    106. } label: {
    107. Text("Get from Cache")
    108. .font(.headline)
    109. .foregroundColor(.white)
    110. .padding()
    111. .background(Color.green)
    112. .cornerRadius(10)
    113. }
    114. if let image = viewModel.cachedImage{
    115. Image(uiImage: image)
    116. .resizable()
    117. .scaledToFill()
    118. .frame(width: 200, height: 200)
    119. .clipped()
    120. .cornerRadius(10)
    121. }
    122. Spacer()
    123. }
    124. .navigationTitle("Cache Bootcamp")
    125. }
    126. }
    127. }

      2.3 效果图

  • 相关阅读:
    axios取消请求原理、拦截器原理- http状态码 - http请求方式
    js和css会不会阻塞页面渲染?
    Netty简介及简单客户端/服务端示例代码
    我们来聊聊锁升级吧
    信息系统项目管理师:软件测试、调试及其管理
    深度学习论文精读[5]:Attention UNet
    软件测试|Python自动化测试实现的思路
    【算法刷题日记之本手篇】跳台阶扩展问题与快到碗里来
    数据库的基本操作(期末复习大全)
    java-php-python-ssm校园失物招领系统计算机毕业设计
  • 原文地址:https://blog.csdn.net/u011193452/article/details/133382937