URL кеша не существует при перестройке проекта - PullRequest
0 голосов
/ 11 марта 2019

Я внедряю кэширование изображений в ios. Следующее - моя функция.

struct DownloadImage {

static let cache = NSCache<NSString,UIImage>()

static func downloadImage(with url: URL,completion: @escaping (_ image: UIImage?) -> ()) {
    let dataTask = URLSession.shared.dataTask(with: url) { (data, responseURL, error) in
        var downloadedImage: UIImage?

        if let data = data {
            downloadedImage = UIImage(data: data)
        }
        if downloadedImage != nil {
            cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
        }
        DispatchQueue.main.async {
            completion(downloadedImage)
        }
    }
    dataTask.resume()
}


static func getImage(withURL url:URL,completion: @escaping (_ image: UIImage?) -> ()) {
    if let image = cache.object(forKey: url.absoluteString as NSString) {
        completion(image)
    } else {
        downloadImage(with: url, completion: completion)
    }
}  

}

Изображение кэшируется, но когда я перестраиваю проект снова, функция загрузки изображения вызывается даже для того же URL-адреса.

Может кто-нибудь сказать мне, что мне не хватает или почему вызывается функция загрузки изображения?

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Как все уже упоминали, вам нужна постоянная память.

Вы можете сделать, чтобы сохранить их:

let fileCoordinator = NSFileCoordinator()
fileCoordinator.coordinate(writingItemAt: someURL, options: .forReplacing, error: nil, byAccessor: { _ in
     do {
          try UIImagePNGRepresentation(image)?.write(to: someURL)
     } catch let error as NSError {
          print (error)
     }
})

А потом прочитать:

if let data = Data(contentsOf: someURL), let image = UIImage(data: data!) }
    return image
} else {
    print ("something wrong reading the image"
}
0 голосов
/ 11 марта 2019

NSCache это просто фантазия NSDictionary .Он не должен сохраняться в течение сеансов и не гарантирует сохранение объектов в памяти даже во время сеанса.

Так что в вашем конкретном случае кэш воссоздается каждый раз, когда вы перестраиваете свое приложение.

...