2016-12-28 10 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, поэтому в настоящее время изучаю, можно ли кэшировать изображения с использованием этой структуры, но я не уверен. Я также читаю, что могу захватить URL-адрес изображения камеры, используя API-интерфейс Photo, который я попытаюсь сделать дальше. Если бы я мог, я захватил бы URL-адрес фотографии, сделанной камерой, и добавлю ее в assetArray.

Если бы это была единая загрузка фотографий, это было бы относительно просто, но поскольку я не хочу препятствовать производительности приложения, сохраняя большой массив данных/изображений, эта задача стала сложной.

Это лучше, чтобы продолжить то, что я делаю:

1) Захват URL, каждое изображение я хочу, чтобы загрузить и хранить их в массив URL. Перед загрузкой на сервер, захватите данные в формате .png каждого URL-адреса и загрузите изображения на сервер

2) Загрузите фактические изображения где-нибудь, поэтому при загрузке на сервер изображения уже будут (не нужно преобразовывать от URL -> изображения). Проблема здесь в том, что многие изображения могут помешать производительности приложения, если это не сделано правильно.

или

3) Некоторые другие методы

Любая помощь будет высоко оценили. Спасибо!

ответ

0

Я нашел решение с помощью Kingfisher. Во-первых, я создал объект ImageCache для VC обработки на несколько фотографий (вам нужно импортировать Kingfisher):

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

После того как я выбрать фотографию с помощью UIImagePickerController, я сохранить уникальный идентификатор в виде массива строк, 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) 
     }) 
    } 
}