iOS实现相册和网络图片的存取

2020-01-20 12:48:05于海丽

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

ios,保存图片到相册,iOS相册存取,获取网络图片

判断 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开发频道。