Skip to content

Instantly share code, notes, and snippets.

@mohamede1945
Last active September 1, 2017 17:52
Show Gist options
  • Save mohamede1945/a077e98eb6e46da37a0272ce2f31f68b to your computer and use it in GitHub Desktop.
Save mohamede1945/a077e98eb6e46da37a0272ce2f31f68b to your computer and use it in GitHub Desktop.
General purpose Cache for Swift, No AnyObject restrictions! Can be used with Structs
extension Hashable {
var hashNumber: NSNumber {
return NSNumber(value: hashValue)
}
}
private class ObjectWrapper {
let value: Any
init(_ value: Any) {
self.value = value
}
}
open class Cache<KeyType: Hashable, ObjectType> {
private let cache: NSCache<NSNumber, ObjectWrapper> = NSCache()
public init(lowMemoryAware: Bool = true) {
guard lowMemoryAware else { return }
NotificationCenter.default.addObserver(
self,
selector: #selector(onLowMemory),
name: .UIApplicationDidReceiveMemoryWarning,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc private func onLowMemory() {
removeAllObjects()
}
open var name: String {
get { return cache.name }
set { cache.name = newValue }
}
weak open var delegate: NSCacheDelegate? {
get { return cache.delegate }
set { cache.delegate = newValue }
}
open func object(forKey key: KeyType) -> ObjectType? {
return cache.object(forKey: key.hashNumber)?.value as? ObjectType
}
open func setObject(_ obj: ObjectType, forKey key: KeyType) { // 0 cost
return cache.setObject(ObjectWrapper(obj), forKey: key.hashNumber)
}
open func setObject(_ obj: ObjectType, forKey key: KeyType, cost: Int) {
return cache.setObject(ObjectWrapper(obj), forKey: key.hashNumber, cost: cost)
}
open func removeObject(forKey key: KeyType) {
return cache.removeObject(forKey: key.hashNumber)
}
open func removeAllObjects() {
return cache.removeAllObjects()
}
open var totalCostLimit: Int {
get { return cache.totalCostLimit }
set { cache.totalCostLimit = totalCostLimit }
}
open var countLimit: Int {
get { return cache.countLimit }
set { cache.countLimit = newValue }
}
open var evictsObjectsWithDiscardedContent: Bool {
get { return cache.evictsObjectsWithDiscardedContent }
set { cache.evictsObjectsWithDiscardedContent = newValue }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment