// // ImageDataCache.swift // Tusker // // Created by Shadowfacts on 1/16/21. // Copyright © 2021 Shadowfacts. All rights reserved. // import UIKit import Cache class ImageDataCache { private let memory: MemoryStorage<(Data, UIImage)> private let disk: DiskStorage? init(name: String, memoryExpiry: Expiry, diskExpiry: Expiry?) { let memoryConfig = MemoryConfig(expiry: memoryExpiry) self.memory = MemoryStorage(config: memoryConfig) if let diskExpiry = diskExpiry { let diskConfig = DiskConfig(name: name, expiry: diskExpiry) self.disk = try! DiskStorage(config: diskConfig, transformer: TransformerFactory.forData()) } else { self.disk = nil } } func has(_ key: String) throws -> Bool { if try memory.existsObject(forKey: key) { return true } else if let disk = self.disk, try disk.existsObject(forKey: key) { return true } else { return false } } func get(_ key: String) throws -> (Data, UIImage)? { if try memory.existsObject(forKey: key) { return try! memory.object(forKey: key) } else if let disk = self.disk, try disk.existsObject(forKey: key), let data = try? disk.object(forKey: key), let image = UIImage(data: data) { return (data, image) } else { return nil } } func getImage(_ key: String) throws -> UIImage? { return try get(key)?.1 } func getData(_ key: String) throws -> Data? { return try get(key)?.0 } func set(_ key: String, data: Data, image: UIImage) throws { memory.setObject((data, image), forKey: key) if let disk = self.disk { try disk.setObject(data, forKey: key) } } func removeAll() throws { memory.removeAll() try? disk?.removeAll() } }