簡體   English   中英

從URL加載圖像並使用Swift4在本地存儲它們

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM