2016-12-28 41 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) 
     }) 
    } 
}