0

在我的应用程序中,我必须使用标准的 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)其他一些方法

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

4

1 回答 1

0

我找到了使用 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)
        })
    }
}
于 2016-12-28T19:32:02.770 回答