? ? ? ? 最近項目中遇到需要保存上傳失敗的圖片,通過匯總所有上傳失敗圖片提供一個展示列表選擇性重發的需求, 所以需要保存失敗圖片的本地路徑以用來在 列表中 通過路徑方式展示圖片:
? ? ? ?//界面刷新 imagePath 對應圖片路徑 ?---- ?imageView.image = UIImage.init(contentsOfFile: imagePath)
? ? 在這里遇到問題,保存圖片的本地路徑在程序的當次運行中都能正常顯示,但是當程序殺死,再重啟后,發現 ?UIImage.init(contentsOfFile: imagePath) ?方法無法獲得 對應的圖片,查看緩存又發現圖片確實存在, 檢測本地緩存路徑發現 一旦 程序重啟 ?上次緩存的路徑都將不復存在,糾結半天后發現iOS 沙盒機制 路徑存儲對應的系統名稱是會在每次重啟后發生變化的,所以導致 上次存儲的 絕對路徑 失效, 下面貼出 具體代碼:
緩存路徑對應的系統沙盒方法:
//************緩存數據路徑*******
? ? /// 沙盒Documents目錄
? ? static let DocumentsURL = NSHomeDirectory() + "/Documents"
? ? /// 沙盒Library目錄
? ? static let LibraryURL = NSHomeDirectory() + "/Library"
? ? /// 沙盒Caches目錄
? ? static let CachesURL = NSHomeDirectory() + "/Library/Caches"
1: 錯誤的獲得圖片路徑并存儲的方式:
? ? ? let name = "\(loginMode.useruid)_\((NSDate().timeIntervalSince1970)).PNG" //文件名
? ? ? let imagePath = RequestURL.DocumentsURL + "/\(name)"? ? ? ? ? //文件路徑 ------
? ? ? ? 通過時間戳 和 用戶ID 做圖片名稱 的唯一標識, 拼接 系統沙盒中的?Documents 目錄下生成絕對路徑?imagePath, ? 將 ?imagePath 作為字符串 保存在 本地, ? 下次程序重啟后 取出 ??imagePath ?,發現無法找到對應數據
2: 修改后的獲得圖片路徑并存儲的方式:
因為系統的 沙盒目錄 動態變化, 所以我們固定存儲的只能是 ??let name = "\(loginMode.useruid)_\((NSDate().timeIntervalSince1970)).PNG" //文件名 , ?沙盒目錄部分(Documents,Library,Library/Caches)需要每次 重新從系統中獲取, ?再與name 拼接成對應路徑 獲取到正確的數據
總而言之,不能通過絕對路徑去獲取本地緩存數據,相對路徑才是正確選擇