Как сохранить и загрузить Image Swift 4? - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть 2 функции saveImage и 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
}

}

Когда я вызываю tableviewcelll так:

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

Я не знаю, как это использовать.

1 Ответ

0 голосов
/ 20 сентября 2019

Создайте класс загрузчика изображений, как показано ниже: -

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()
    }
}

}

загрузите изображение с URL и сохраните его (создавая массив UIImage)

, который вы можете использоватьэтот массив, как вы хотите.

используйте ниже расширение для установки изображения непосредственно к виду изображения.

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

этот также поможет вам

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