Лучшая практика для хранения и загрузки нескольких изображений из ImagePicker (iOS)

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

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

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

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

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

or

3) Другой метод

Любая помощь будет принята с благодарностью. Спасибо!


person Josh O'Connor    schedule 28.12.2016    source источник


Ответы (1)


Я нашел решение с помощью 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)
        })
    }
}
person Josh O'Connor    schedule 28.12.2016