Skip to content

Instantly share code, notes, and snippets.

@brunodelgado
Created December 2, 2019 13:59
Show Gist options
  • Save brunodelgado/9259c41e3fc99a50b727b541f03f9240 to your computer and use it in GitHub Desktop.
Save brunodelgado/9259c41e3fc99a50b727b541f03f9240 to your computer and use it in GitHub Desktop.
Simple codable on disk cache implementation
class AnyDiskCache {
static func invalidate(name: String) throws {
let manager = FileManager.default
let urls = manager.urls(for: .cachesDirectory, in: .userDomainMask)
let url = urls[0].appendingPathComponent(name + ".cache")
try manager.removeItem(at: url)
}
}
final class DiskCache<T: Codable>: AnyDiskCache {
func save(object: T, name: String) throws {
// Preventing caching empty arrays
if let collection = object as? Array<T>, collection.isEmpty {
return
}
let urls = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
let url = urls[0].appendingPathComponent(name + ".cache")
guard let data = try? JSONEncoder().encode(object) else { return }
try data.write(to: url)
}
func retrieve(name: String) throws -> T? {
let urls = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
let url = urls[0].appendingPathComponent(name + ".cache")
guard let data = try? Data(contentsOf: url) else { return nil }
return try JSONDecoder().decode(T.self, from: data)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment