【问题标题】:Best practice for storing and uploading multiple images from ImagePicker (iOS)从 ImagePicker (iOS) 存储和上传多个图像的最佳实践
【发布时间】:2016-12-28 18:59:08
【问题描述】:

在我的应用程序中,我必须使用标准的 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,所以我目前正在研究是否可以使用该框架缓存图像,但我不确定。我还在读到我可以使用 Photo 的 API 获取相机图像的 URL,我将在接下来尝试。如果可以的话,我会抓取相机拍摄的照片的 url,并将其附加到assetArray。

如果这是单张照片上传,这将相对简单,但由于我不想通过存储大量数据/图像数组来影响应用程序的性能,因此这项任务变得复杂了。

最好继续我正在做的事情:

1) 抓取我要上传的每张图片的 URL,并将它们存储到 URL 数组中。在上传到服务器之前,先抓取每个URL的.png格式的数据,然后上传图片到服务器

2) 在某处缓存实际图像,因此当上传到服务器时,图像已经存在(不需要从 URL -> 图像转换)。这里的问题是,如果处理不当,许多图像可能会影响应用性能。


3) 其他一些方法

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: ios url photos kingfisher


    【解决方案1】:

    我找到了使用 Kingfisher 的解决方案。首先,我为处理多张照片的 VC 创建了一个 ImageCache 对象(需要导入 Kingfisher):

    fileprivate var imageCache: ImageCache = ImageCache(name: "newTaskCache")
    

    使用 UIImagePickerController 选择照片后,我将唯一 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)
            })
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多