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

时间:2019-03-16 02:02:47

标签: ios swift uiimage

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

1 个答案:

答案 0 :(得分:0)

这是一个可变范围的简单问题。您在element.all(by.xpath("//span[@class='abc']")).count().then(function (count) { element.all(by.xpath("//span[@class='abc']")).each(function (elem, index) { elem.getText().then(function (name) { console.log("NAME IS " + name); var row = element(by.xpath('//span[contains(text(),"' + name + '")]/../../..')); row.click(); var overFlow = element(by.xpath('//span[contains(text(),"' + name + '")]/../../..//*[@class="zzz"]')); helper.clickElemWithJavascript(overFlow); helper.scrollIntoView(deleteButton); helper.clickElemWithJavascript(deleteButton); }) }) }); //count 块内声明loadedImage,但随后尝试在该块外(之后)使用。

do的使用移到loadedImage块中。

您还需要更好的错误处理和更好的可选结果处理。并且您的do方法可能应该返回一个可选图像,以防所有尝试获取该图像的尝试失败。或返回一些默认图片。

这是使用更好的API以及对可选项和错误的更好处理重写的方法。

load

如果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 } } 是远程URL,那么您绝不能在主队列上运行此代码。