2016-12-28 15 views
0

在我的应用程序中,我必须使用标准的iOS UIImagePickerController库将多张照片存储并上传到服务器。目前,我在存储存储UIImagePickerControllerReferenceURL的照片库的工作:从ImagePicker(iOS)存储和上传多个图像的最佳实践

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,我将在下面尝试。如果可以,我会抓取相机拍摄的照片的网址,并将其附加到assetArray。

如果这是一个单一的照片上传,这将是相对简单的,但由于我不想通过存储大型数据/图像数组阻碍应用程序的性能,这项任务已变得复杂。

它是最好继续我在做什么:

1)抓取URL我要上传每个图像的,并把它们存储到一个URL数组。在上传到服务器之前,抓取每个URL的.png格式的数据,并上传图像到服务器

2)缓存某处的实际图像,因此当上传到服务器时,图像已经存在(不需要转换从URL - >图像)。如果没有正确完成,问题在于许多图片可能会妨碍应用程序的性能。


3)的一些其他方法

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

回答

0

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

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) 
     }) 
    } 
}