我需要从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表示形式。关于此错误的任何建议将不胜感激。
答案 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,那么您绝不能在主队列上运行此代码。