Загрузка изображений с URL-адреса и их локальное хранение с помощью Swift4 - PullRequest
0 голосов
/ 16 марта 2019

Мне нужно загрузить изображения с URL-адреса и сохранить их локально, чтобы их не приходилось перезагружать снова и снова. У меня есть расширение, над которым я работаю:


    extension UIImage {
        func load(image imageName: String) -> UIImage {
            // declare image location
            let imagePath: String = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(imageName).png"
            let imageUrl: URL = URL(fileURLWithPath: imagePath)

            // check if the image is stored already
            if FileManager.default.fileExists(atPath: imagePath),
                let imageData: Data = try? Data(contentsOf: imageUrl),
                let image: UIImage = UIImage(data: imageData, scale: UIScreen.main.scale) {
                return image
            }

            // image has not been created yet: create it, store it, return it
            do {
                let url = URL(string: eventInfo!.bannerImage)!
                let data = try Data(contentsOf: url)
                let loadedImage: UIImage = UIImage(data: data)!
            }
            catch{
                print(error)
            }

            let newImage: UIImage = 
                try? UIImagePNGRepresentation(loadedImage)?.write(to: imageUrl)
            return newImage
        }
    }

Я сталкиваюсь с проблемой, когда «Загруженный образ» в UIImagePNGRepresentation возвращается с ошибкой «Использование неразрешенного идентификатора загруженного изображения». Моя цель - хранить PNG-представление изображения локально. Буду признателен за любые предложения по этой ошибке.

1 Ответ

0 голосов
/ 16 марта 2019

Это простой вопрос переменной области.Вы объявляете loadedImage внутри блока do, но затем пытаетесь использовать вне (после) этого блока.

Переместите использование loadedImage в блок do.

Вам также нужна лучшая обработка ошибок и лучшая обработка необязательных результатов.И ваш load метод, вероятно, должен возвращать необязательное изображение, если все попытки получить его не удаются.Или верните какое-нибудь изображение по умолчанию.

Вот ваш метод, переписанный с использованием улучшенных API и улучшенной обработки опций и ошибок.

extension UIImage {
    func load(image imageName: String) -> UIImage? {
        // declare image location
        guard let imageUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent(imageName).appendingPathExtension("png") else {
            return nil // or create and return some default image
        }

        // check if the image is stored already
        if FileManager.default.fileExists(atPath: imageUrl.path) {
            if let imageData = try? Data(contentsOf: imageUrl), let image = UIImage(data: imageData) {
                return image
            }
        }

        // image has not been created yet: create it, store it, return it
        do {
            let url = URL(string: eventInfo!.bannerImage)! // two force-unwraps - consider better handling of this
            if let data = try Data(contentsOf: url), let loadedImage = UIImage(data: data) {
                try data.write(to: imageUrl)

                return loadedImage
            }
        }
        catch{
            print(error)
        }

        return nil // or create and return some default image
    }
}

Если eventInfo!.bannerImage является удаленным URL, то вы никогда не должны запускатьсяэтот код в главной очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...