Search code examples
swiftuiimageviewsaveload

How to save and load Image swift 4?


I have 2 functions saveImage and loadImage:

//saveImage
func saveImage(imageName: String, image: UIImage) {

    guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
    let fileName = imageName
    let fileURL = documentsDirectory.appendingPathComponent(fileName)
    guard let data = image.jpegData(compressionQuality: 1) else { return }

    if FileManager.default.fileExists(atPath: fileURL.path) {
        do {
            try FileManager.default.removeItem(atPath: fileURL.path)
            print("Removed old image")
        } catch let removeError {
            print("couldn't remove file at path", removeError)
        }
    }
        do {
        try data.write(to: fileURL)
    } catch let error {
        print("error saving file with error", error)
    }
}

//loadImage
func loadImageFromDocuments(fileName: String) -> UIImage? {

    let documentDirectory = FileManager.SearchPathDirectory.documentDirectory

    let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask
    let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)

    if let dirPath = paths.first {
        let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName)
        let image = UIImage(contentsOfFile: imageUrl.path)
        return image

    }

    return nil
}

}

When I call in tableviewcelll like this:

self.cachedImageView.saveImage(imageName:,image:)
self.cachedImageView.loadImageFromDocuments(fileName:)

I don't how know use that.


Solution

  • Create image loader class like below :-

    class PKImageLoader {
    let imageCache = NSCache<NSString, UIImage>()
    
    class var sharedLoader: PKImageLoader {
        struct Static {
            static let instance: PKImageLoader = PKImageLoader()
        }
        return Static.instance
    }
    
    func imageForUrl(urlPath: String, completionHandler: @escaping (_ image: UIImage?, _ url: String) -> ()) {
        guard let url = urlPath.toUrl else {
            return
        }
        if let image = imageCache.object(forKey: urlPath as NSString) {
            completionHandler(image, urlPath)
        }
        else {
            URLSession.shared.dataTask(with: url) { data, _, _ in
                guard let finalData = data else { return }
    
                DispatchQueue.main.async {
                    if let img = UIImage(data: finalData) {
                        self.imageCache.setObject(img, forKey: urlPath as NSString)
                         completionHandler(img, urlPath)
                    }
                }
            }.resume()
        }
    }
    

    }

    download an image from URL and save it (by creating UIImage Array)

    you can use that array as you want.

    use below extension for setting image directly to image view.

    extension UIImageView {
    func setImage(from urlPath: String, placeHolder: UIImage? = nil) {
        self.image = placeHolder
        PKImageLoader.sharedLoader.imageForUrl(urlPath: urlPath) { image, _ in
            self.image = image
        }
    }
    

    this one also help you

    extension String {
    var toUrl: URL? {
        if self.hasPrefix("https://") || self.hasPrefix("http://") {
            return URL(string: self)
        }
        else {
            return URL(fileURLWithPath: self)
        }
    }