Доступ к файлам изображений на рулоне камеры (iOS 12.1.4, Swift 4.2, Xcode 10.1)

0
задан Cœur 7 March 2019 в 01:10
поделиться

1 ответ

Несмотря на то, что опубликованный код 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
}
0
ответ дан Iko 7 March 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: