最近项目中遇到需要保存上传失败的图片,通过汇总所有上传失败图片提供一个展示列表选择性重发的需求, 所以需要保存失败图片的本地路径以用来在 列表中 通过路径方式展示图片:
//界面刷新 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 拼接成对应路径 获取到正确的数据
总而言之,不能通过绝对路径去获取本地缓存数据,相对路径才是正确选择