当前位置: 首页 > 知识库问答 >
问题:

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

屈升
2023-03-14

我需要从一个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”返回时出现错误“use of unresolved identifier loadedImage”。我的目标是在本地存储图像的PNG表示。对此错误的任何建议将不胜感激。

共有1个答案

严俊友
2023-03-14

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

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,则绝不能在主队列上运行此代码。

 类似资料:
  • 我的问题是:当我使用活动存储时,如何从URL上传图像。我在Stackoverflow中使用了来自其他帖子的代码,但传递了model方法,即我需要存储在表中的param。奇怪的是,我收到了下一个错误: 但是当我从这个模型重新加载show视图时,图像显示为存储并部署在我的posts视图中。 在这里我的代码后模型: 这是我在控制器的编辑操作中的代码: 我得到了以下链接,其中谈到了从URL上传图像的机会,

  • 我想从桶S3下载一个图像并存储在变量中,而不是在我的本地电脑中,我怎么做? 我使用此代码存储在本地:

  • 问题内容: 我想从我的应用程序中的URL加载图像,因此我首先尝试使用Objective-C,但是它可以正常工作,但是对于Swift,我遇到了编译错误: ‘imageWithData’不可用:使用对象构造’UIImage(data :)’ 我的功能: 在Objective-C中: 有人可以解释一下为什么Swift无法使用它,以及如何解决该问题。 问题答案: Xcode 8或更高版本•Swift 3或

  • 问题内容: 我在eclipse的java项目中具有这样的结构: src / com / myprogram /…/ foo.java res / icon.png 。项目 … 我知道您可以使用以下方式从罐子中加载图像 当您尝试直接使用eclipse运行应用程序时会出现问题,因为(我想)res文件夹不在src文件夹中,则会显示 。我想为源代码和资源提供单独的文件夹。 另外,我发现我可以将文件夹添加到

  • 问题内容: 问题描述: 我正在创建一个滚动的带有缩略图的文章列表,该列表由我的SQLite数据库填充。通常,它运行缓慢,但速度较慢: 图像加载非常缓慢…我想使用“ 通用图像加载器 ”将图像缓存在设备上,如果您已经查看过图像(或者至少接近该图像,那会使它们看起来只是滚动到视图中) )。但是- 当您向上/向下拖动时,没有任何图像,然后在3-5秒后,图像开始弹出(就像重新下载它们一样) 我正在动态更改缩