一种方法是,根据 diskImageExistsWithKey: 方法,获取 Disk 上的 Data。

判断 Disk 的图片是否存在,就是查找两个路径。同样,拿到这两个路径的文件就可以获得 Data。以下是 Swift 代码示例
SDWebImageManager.shared().diskImageExists(for: imageUrl) { [weak self] (exist) in
// Always on main thread
guard self != nil else { return }
if exist {
// Find image data from disk
var data: NSData?
// Get cache key
let key = SDWebImageManager.shared().cacheKey(for: imageUrl)
// Get cache path
if let path = SDImageCache.shared().defaultCachePath(forKey: key) {
data = NSData(contentsOfFile: path)
if data == nil {
data = NSData(contentsOfFile: (path as NSString).deletingPathExtension)
}
}
if data != nil {
// Get image data
} else {
// Fail getting image data
}
} else {
// No disk image
}
}
这个方法缺点在于,代码复杂,可能会在 SDWebImage 版本升级后失效(例如,Disk 缓存路径改变)。
推荐的方法是,将图片缓存从 Memory 中移除,然后调用 SDWebImageManager 的 loadImage: 方法。
// Get cache key
let key = SDWebImageManager.shared().cacheKey(for: imageUrl)
// Remove memory cache
SDImageCache.shared().removeImage(forKey: key, fromDisk: false, withCompletion: nil)
// Load image and data
SDWebImageManager.shared().loadImage(with: imageUrl, options: SDWebImageOptions(rawValue: 0), progress: nil) { [weak self] (_, data, _, _, _, _) in
guard self != nil else { return }
if data != nil {
// Get image data
} else {
// Fail getting image data
}
}
这样写比较简洁。即使 SDWebImage 版本升级后改变 Disk 缓存路径,依然有效。以上代码执行之后,当前图片又会存在 Memory 中。
遗留问题
将 JPG 图片的 Data 保存至相册,然后再取出的 Data 与保存的 Data 可能不一样。requestImageData: 方法传入 PHImageRequestOptions,PHImageRequestOptions 的 version 试了三种值(current、unadjusted、original)都不行。PNG、GIF 图片还没遇到这个问题。可能保存 JPG 图片的过程会修改原始数据。如何使存取的数据一致?欢迎交流!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。
注:相关教程知识阅读请移步到IOS开发频道。










