Created
December 2, 2019 13:59
-
-
Save brunodelgado/9259c41e3fc99a50b727b541f03f9240 to your computer and use it in GitHub Desktop.
Simple codable on disk cache implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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