复制代码
func requestImageData(for asset: PHAsset, options: PHImageRequestOptions?, resultHandler: @escaping (Data?, String?, UIImageOrientation, [AnyHashable : Any]?) -> Void) -> PHImageRequestID
以下是代码示例
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
picker.dismiss(animated: true, completion: nil)
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
// Get original image
}
if let url = info[UIImagePickerControllerReferenceURL] as? URL,
let asset = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil).firstObject {
PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { (imageData, _, _, _) in
if let data = imageData {
// Get image data
}
})
}
}
从 SDWebImage 的缓存中获取 UIImage、Data
SDWebImage 给 UIImageView 提供了方法,方便获取、显示网络图片。如果需要获取下载的图片(进行保存到相册、上传至服务器等操作),可以用以下方法
- (nullable id <SDWebImageOperation>)loadImageWithURL:(nullable NSURL *)url
options:(SDWebImageOptions)options
progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
completed:(nullable SDInternalCompletionBlock)completedBlock;
Swift 的代码示例
SDWebImageManager.shared().loadImage(with: url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { [weak self] (cachedImage, imageData, error, _, _, _) in
guard self != nil else { return }
if let image = cachedImage {
// Get image
}
if let data = imageData {
// Get image data
}
if error != nil {
// Handle error
}
})
这个方法有个问题,对于静态图片,可能获取不到 Data。如果需要获取图片 Data 的话,不能直接这么写。查看源码可以找到原因。SDWebImageManager 的 loadImage: 方法会调用 SDImageCache 的 queryCacheOperationForKey: 方法

diskImageDataBySearchingAllPathsForKey: 方法用来获取 Disk 中图片的 Data。当图片在 Memory 中,只有 GIF 图片才会提供 Data,静态图的 Data 为空;当图片在 Disk 中,都会提供 Data。如果能在外部直接调用 diskImageDataBySearchingAllPathsForKey: 方法就很简单,但是不行,这是私有方法,只写在 .m 文件里,对外不可见。
改源码可以解决问题,将上图第一个箭头的 if 判断去掉,总是调用 diskImageDataBySearchingAllPathsForKey: 方法。然而,改第三方库源码不好,可能会有想不到的糟糕后果。










