Загрузите изображение из Firestore и сохраните его в кеш в Swift

Я работаю над приложением, которое должно загружать некоторые изображения и данные с сервера при каждом запуске (чтобы убедиться, что оно использует актуальную информацию). Я использую Firestore в качестве БД и в настоящее время храню в нем изображения как URL-адрес хранилища Firebase.

Можно ли каким-то образом сохранить реальное изображение в Firestore? А как можно кешировать загруженное изображение? Либо из

UIImage(contentsOf: URL)

или из Firestore?


person Maxim Skryabin    schedule 15.06.2018    source источник


Ответы (4)


Попробуйте этот асинхронный загрузчик изображений с поддержкой кеша в качестве категории UIImageView - http://cocoadocs.org/docsets/SDWebImage Он называется sdwebimage, очень простой в использовании

person Abdull    schedule 16.06.2018

Вы можете использовать тип bytes в Firestore (см. список типов), чтобы сохранить любые двоичные данные, которые вы хотите (используйте NSData на iOS), но это почти наверняка не то, что вы действительно хотите делать. Ограничение на размер всего документа составляет 1 МБ, и изображения могут легко превышать это значение. Кроме того, вы будете оплачивать загрузку этого изображения клиенту каждый раз, когда этот документ будет прочитан, что может быть расточительным.

Вам будет гораздо лучше сохранить фактические данные файла в облачном хранилище (используя Firebase SDK на клиенте), а затем сохранить ссылку или URL-адрес в документе и извлекать его оттуда только при необходимости.

person Doug Stevenson    schedule 15.06.2018
comment
Вы упоминаете NSData в iOS для хранения данных как байтовый тип в Firestore. Вы случайно не знаете, как хранить данные в виде байтов из веб-API? - person Venryx; 15.12.2018
comment
Для другого чтения я нашел здесь ответ: stackoverflow.com/a/53672081/2441655 - person Venryx; 15.12.2018

Вы можете использовать https://github.com/pinterest/PINRemoteImage, в этой структуре используется https://github.com/pinterest/PINCache

import PINRemoteImage

extension UIImageView {

    public func setImageFrom(urlString: String!, animated: Bool = false) {


        guard let urlString = urlString else {
            return
        }


        guard let url = URL(string: urlString) else {
            return
        }

        layer.removeAllAnimations()
        pin_cancelImageDownload()
        image = nil

        if !animated {
            pin_setImage(from: url)
        } else {
            pin_setImage(from: url, completion: { [weak self] result in
                guard let _self = self else { return }
                _self.alpha = 0
                UIView.transition(with: _self, duration: 0.5, options: [], animations: { () -> Void in
                    _self.image = result.image
                    _self.alpha = 1
                }, completion: nil)
            })
        }
    }
}

....

UIImageView(). setImageFrom(urlString: "https://ssssss")
person Carlos Chaguendo    schedule 15.06.2018

Я не знаю, является ли это наиболее эффективным способом решения моей проблемы, но я сделал это следующим образом:

В моей БД Firestore я сохранил ссылки на изображения в облачном хранилище. Затем, когда приложение запускается в первый раз, оно загружает эти файлы из базы данных Firestore, используя методы по умолчанию, И сохраняет эти изображения в контейнере приложения (папка документов) с помощью Swift FileManager ().

В следующий раз, когда приложение запускается, оно проходит через массив ссылок и пропускает файлы, которые уже находятся в контейнере приложения.

person Maxim Skryabin    schedule 19.06.2018