gpt4 book ai didi

ios - 使用 Swift4 从 URL 加载图像并将其存储在本地

转载 作者:行者123 更新时间:2023-11-29 05:55:39 24 4
gpt4 key购买 nike

我需要从 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 中的“loadedImage”返回错误“使用未解析的标识符loadedImage”。我的目标是在本地存储图像的 PNG 表示形式。任何有关此错误的建议将不胜感激。

最佳答案

这是一个简单的变量范围问题。您在 do block 内声明 loadedImage,但随后尝试在该 block 外部(之后)使用。

loadedImage 的使用移至 do block 内。

您还需要更好的错误处理和可选结果的更好处理。并且您的 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,那么您绝不能在主队列上运行此代码。

关于ios - 使用 Swift4 从 URL 加载图像并将其存储在本地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55192775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com