[英]Loading images from a URL and storing them locally using Swift4
我需要從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
塊中聲明了loadedImage
,但之后您嘗試在該塊之外使用(之后)。
將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,則您絕不能在主隊列上運行此代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.