从 ImagePicker 存储和上传多张图片的最佳实践 (iOS)
Best practice for storing and uploading multiple images from ImagePicker (iOS)
在我的应用程序中,我必须使用标准 iOS UIImagePickerController 库将多张照片存储并上传到服务器。目前,我正在为照片库存储 UIImagePickerControllerReferenceURL:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let assetURL = info["UIImagePickerControllerReferenceURL"] as? URL {
assetArray.append(assetURL) //assetArray globally stored as 'fileprivate var assetArray = [URL]()'
}
}
但是,我刚刚在某处看到相机不提供 "UIImagePickerControllerReferenceURL" 键。因此,当我转到相机部分时,这种方法可能行不通,所以我现在正在重新考虑我的逻辑。
我正在使用 KingFisher,所以我目前正在研究是否可以使用该框架缓存图像,但我不确定。我还读到我可以使用照片的 API 获取相机图像的 URL,接下来我将尝试这样做。如果可以的话,我会抓取相机拍摄的照片的 url,并将其附加到 assetArray。
如果这是单张照片上传,这会相对简单,但由于我不想通过存储大型 data/image 数组来影响应用程序的性能,因此此任务变得复杂。
最好继续我正在做的事情:
1) 抓取我要上传的每张图片的 URL,并将它们存储到 URL 数组中。上传到服务器前,抓取每个URL.png格式的数据,上传图片到服务器
2) 在某处缓存实际图像,因此当上传到服务器时,图像已经存在(不需要从 URL -> 图像转换)。这里的问题是,如果处理不当,图像过多可能会影响应用性能。
或
3) 其他一些方法
如有任何帮助,我们将不胜感激。谢谢!
我找到了使用 Kingfisher 的解决方案。首先,我为 VC 创建了一个 ImageCache 对象来处理多张照片(您需要导入 Kingfisher):
fileprivate var imageCache: ImageCache = ImageCache(name: "newTaskCache")
使用 UIImagePickerController select 照片后,我将唯一 ID 保存在字符串数组中,cachedImageIDs:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image : UIImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
let imageID: String?
if let assetURL = info["UIImagePickerControllerReferenceURL"] as? URL {
imageID = assetURL.absoluteString
cachedImageIDs.append(imageID!)
}else{
//camera does not return a UIImagePickerControllerReferenceURL, so unique imageID will be posix time, until I figure out how to get imageURL string
imageID = String(describing: Date().posixTime())
cachedImageIDs.append(imageID!)
}
imageCache.store(image, forKey: imageID!) {
print("saved image")
picker.dismiss(animated: true, completion: nil)
}
}
当我需要检索图像时,它们是
func getImages() {
for id in cachedImageIDs {
//retrieve image
imageCache.retrieveImage(forKey: id, options: nil, completionHandler: { (image, cacheType) -> () in
print(image)
})
}
}
在我的应用程序中,我必须使用标准 iOS UIImagePickerController 库将多张照片存储并上传到服务器。目前,我正在为照片库存储 UIImagePickerControllerReferenceURL:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let assetURL = info["UIImagePickerControllerReferenceURL"] as? URL {
assetArray.append(assetURL) //assetArray globally stored as 'fileprivate var assetArray = [URL]()'
}
}
但是,我刚刚在某处看到相机不提供 "UIImagePickerControllerReferenceURL" 键。因此,当我转到相机部分时,这种方法可能行不通,所以我现在正在重新考虑我的逻辑。
我正在使用 KingFisher,所以我目前正在研究是否可以使用该框架缓存图像,但我不确定。我还读到我可以使用照片的 API 获取相机图像的 URL,接下来我将尝试这样做。如果可以的话,我会抓取相机拍摄的照片的 url,并将其附加到 assetArray。
如果这是单张照片上传,这会相对简单,但由于我不想通过存储大型 data/image 数组来影响应用程序的性能,因此此任务变得复杂。
最好继续我正在做的事情:
1) 抓取我要上传的每张图片的 URL,并将它们存储到 URL 数组中。上传到服务器前,抓取每个URL.png格式的数据,上传图片到服务器
2) 在某处缓存实际图像,因此当上传到服务器时,图像已经存在(不需要从 URL -> 图像转换)。这里的问题是,如果处理不当,图像过多可能会影响应用性能。
或
3) 其他一些方法
如有任何帮助,我们将不胜感激。谢谢!
我找到了使用 Kingfisher 的解决方案。首先,我为 VC 创建了一个 ImageCache 对象来处理多张照片(您需要导入 Kingfisher):
fileprivate var imageCache: ImageCache = ImageCache(name: "newTaskCache")
使用 UIImagePickerController select 照片后,我将唯一 ID 保存在字符串数组中,cachedImageIDs:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image : UIImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
let imageID: String?
if let assetURL = info["UIImagePickerControllerReferenceURL"] as? URL {
imageID = assetURL.absoluteString
cachedImageIDs.append(imageID!)
}else{
//camera does not return a UIImagePickerControllerReferenceURL, so unique imageID will be posix time, until I figure out how to get imageURL string
imageID = String(describing: Date().posixTime())
cachedImageIDs.append(imageID!)
}
imageCache.store(image, forKey: imageID!) {
print("saved image")
picker.dismiss(animated: true, completion: nil)
}
}
当我需要检索图像时,它们是
func getImages() {
for id in cachedImageIDs {
//retrieve image
imageCache.retrieveImage(forKey: id, options: nil, completionHandler: { (image, cacheType) -> () in
print(image)
})
}
}