Это простой вопрос переменной области.Вы объявляете 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, то вы никогда не должны запускатьсяэтот код в главной очереди.