Несмотря на то, что опубликованный код Ajinkya Sharma работал, я заметил, что при сохранении creationRequestForAsset производительность по сохранению изображений в кадре камеры была значительно ниже по сравнению с UIImageWriteToSavedPhotosAlbum. Поэтому я выбрал гибридное решение. Я сохранил, используя старую функцию, затем использовал среду PHAsset, чтобы получить самый новый файл изображения и получить его URL. Проблема решена.
public func saveImgToLocal(_ img: UIImage) {
// significantly faster than creationRequestForAsset
UIImageWriteToSavedPhotosAlbum(img, self, #selector(imageSaved(_:didFinishSavingWithError:contextInfo:)), nil)
}
@objc func imageSaved(_ img: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
if let error = error {
// we got back an error!
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.fetchLimit = 1
let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
if let asset = fetchResult.firstObject
{
self.imageHash.text = getAsset(asset: asset)
}
}
}
func getAsset(asset: PHAsset) -> String {
let manager = PHImageManager.default()
let option = PHImageRequestOptions()
var hashString = "" as String
option.isSynchronous = true
manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: option, resultHandler: {(result, info) -> Void in
let url = info!["PHImageFileURLKey"] as! NSURL
do {
let data = try Data(contentsOf: url as URL)
hashString = data.md5.rawValue
}
catch {
hashString = "Error computing hash"
}
})
return hashString
}